postgreSQL max select取决于组

时间:2013-05-10 20:36:12

标签: sql postgresql select filter

我面临一个特别困难(我的技能水平)选择查询。 我在数据库中有一些数据如下: 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个结果。它可能需要一些调整或完全重写。任何帮助将不胜感激!先谢谢你们!

亲切的问候。

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语法,它可以做同样的事情,但这是特定于数据库的。