0

我正面临一个特别困难的(就我的技能水平而言)选择查询。我在数据库中有一些数据,如下所示: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...

我需要的是一个 Select 查询,它将返回每对夫妇的最大(大小)及其所属的 ID...

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 个结果。它可能需要一些调整或完全重写。任何帮助将不胜感激!提前谢谢各位!

亲切的问候。

4

1 回答 1

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

于 2013-05-10T20:40:59.053 回答