【问题标题】:SQL Query, latest rows for each unique duo [duplicate]SQL 查询,每个唯一二人组的最新行 [重复]
【发布时间】:2014-03-14 08:36:43
【问题描述】:

我必须做一个 sql 查询,但我不知道该怎么做。我想获取每个独特的二人组 A/B 的最新行。我正在使用 postgresql。

例如:
表:人

id  A  B  modification_date
1   5  6  2014-04-12
2   6  7  2014-04-13
3   5  6  2014-04-14
4   9  1  2014-04-15
5   6  7  2014-04-16

我想得到:

id  A  B  modification_date
3   5  6  2014-04-14
4   9  1  2014-04-15
5   6  7  2014-04-16

感谢您的帮助。

【问题讨论】:

  • 为什么5 6 2014-04-12 在预期结果中? “最新”(即 5/6 的“最新”行应该是 5 6 2014-04-14,不是吗?
  • 你是对的 a_horse_with_no_name,我更正了

标签: sql postgresql greatest-n-per-group


【解决方案1】:
SELECT DISTINCT ON (a, b)
       *
FROM   person
ORDER  BY a, b, modification_date DESC;

详解:
Select first row in each GROUP BY group?

【讨论】:

    【解决方案2】:

    SELECTMAXimum of modification_date for each GROUP of (A, B),然后JOIN回到原来的行来获取值(需要得到@ 987654328@专栏):

    SELECT t1.*
    FROM Person t1
    JOIN
    (
        SELECT MAX(modification_date) max_date, A, B
        FROM Person
        GROUP BY A, B
    ) t2 ON t1.A = t2.A AND t1.B = t2.B AND t1.modification_date = t2.max_date
    

    更简单地说,如果您不关心返回哪个id,并且即使modification_date 重复,您也只想要一行,您只需选择MINimum 值id 即可完成它:

    SELECT MIN(id) id, A, B, MAX(modification_date) modification_date
    FROM Person
    GROUP BY A, B
    

    【讨论】:

    • 感谢这个完美的作品!
    【解决方案3】:
    SELECT id, a, b, modification_date
    FROM person p
    WHERE NOT EXISTS (
        SELECT *
        FROM person nx
        WHERE nxa = pa AND nx.b = p.b
        AND (nx.modification_date > p.modification_date
             OR nx.modification_date = p.modification_date AND nx.id > p.id)
        );
    

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 2011-04-29
      • 2021-06-02
      • 2011-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多