【问题标题】:postgreSQL max select depending on groupspostgreSQL 最大选择取决于组
【发布时间】:2013-05-05 14:53:16
【问题描述】:

我正面临一个特别困难的(就我的技能水平而言)选择查询。 我在数据库中有一些数据,如下所示: 4 列(男名/女名/大小/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 个结果。它可能需要一些调整或完全重写。任何帮助将不胜感激!提前谢谢各位!

亲切的问候。

【问题讨论】:

    标签: sql postgresql select filter


    【解决方案1】:

    一般来说,我使用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 语法,它可以做同样的事情,但这是完全特定于数据库的。

    【讨论】:

    • 非常感谢。不幸的是,我已经尝试过你给我的东西,虽然它可以部分工作(将情侣分组等),但它无法过滤掉尺寸较小的情侣。
    • @GeorgeElementSotiriou 。 . .您的查询中有where seqnum = 1 吗?您的分区子句是否只包含这两个名称?
    • 这两个答案都是肯定的。此外,我已经更正了您几分钟前编辑的“mytable t”部分,因为我发现它应该是我自己的。仍然进行分区我有我相同的“情侣”一个接一个地按大小递减,但它未能排除具有最小大小号的重复情侣。对不起,让你的生活变得艰难......! :(
    • @GeorgeElementSotiriou 。 . .在这种情况下,我猜这两行的名称相同——有一些隐藏的字符或空格可能不可见。
    • 可能是这种情况,因为这些名称来自 2 个不同的 excel 文件(因此 ID 1 或 2),它们由 2 个不同的人维护。我会检查这个并尽快提供反馈......我已经检查了这些差异,并且没有用“肉眼”看到任何差异。我现在会尝试一些复制/粘贴和一些手动工作。
    猜你喜欢
    • 2013-05-31
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2015-08-30
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多