我面临一个特别困难(我的技能水平)选择查询。 我在数据库中有一些数据如下: 4列(maleName / femaleName / size / id)。 列数据或多或少不言自明。我有一个男性的名字,一个女性的名字,一个大小和一个id(只有值1或2)相应的每列。唯一的问题是男性和女性的名字(作为夫妻)出现的次数超过1次。
Database example.
# | MaleName | FemaleName | Size | ID
1 - John - Mary - 9 - 1
2 - Nick - Stacey - 6 - 1
3 - Mike - Rachel - 2 - 1
4 - John - Mary - 3 - 2
5 - Mike - Rachel - 20 - 2
6 - Nick - Stacey - 13 - 2
etc...
我需要的是一个选择查询,它将返回每对夫妇的最大(大小)及其所属的身份......
Result example.
# | MaleName | FemaleName | Size | ID
1 - John - Mary - 9 - 1
2 - Nick - Stacey - 13 - 2
3 - Mike - Rachel - 20 - 2
到目前为止我所做的是:
select a.Mname,a.Fname,a.size
from mytable a , mytable b
where a.id=b.id and
a.size in (select max(a.size) from mytable a , mytable b where a.id=b.id)
group by a.Mname, a.Fname, a.size;
我不知道我是否接近或完全错误。这会返回1个结果。它可能需要一些调整或完全重写。任何帮助将不胜感激!先谢谢你们!
亲切的问候。
答案 0 :(得分:2)
一般来说,我使用row_number()
来解决这些问题,因为这适用于许多数据库:
select mname, fname, size, id
from (select t.*,
row_number() over (partition by t.mname, t.fname order by t.size desc) as seqnum
from mytable t
) t
where seqnum = 1
函数row_number()
为组内的行分配序号。在这种情况下,具有相同名称对的所有行都将编号(partition by
子句)。编号从具有最大大小的行(order by size desc
)开始。您需要最大的大小,因此序列号为1。
Postgres还支持distinct on
语法,它可以做同样的事情,但这是特定于数据库的。