【问题标题】:Find MAX from field1, corresponding field2, GROUP BY field3从field1中找到MAX,对应field2,GROUP BY field3
【发布时间】:2018-09-19 03:09:56
【问题描述】:

我有这样的数据:

id, id2, datetime_created
1, 1, 9/10
1, 2, 9/9
1, 3, 9/8
2, 4, 9/8
2, 5, 9/2
2, 6, 9/1
3, 7, 9/3
3, 8, 9/4
3, 9, 9/5

预期输出:

id, id2
1, 1
2, 4
3, 9

我尝试了很多方法,包括:

SELECT id, id2, MAX(datetime_created)
FROM table
GROUP BY id2

SELECT id, id2, MAX(datetime_created)
FROM table
GROUP BY id, id2

,

SELECT id, id2
FROM table
INNER JOIN (
    SELECT MAX(datetime_created), id
    FROM table)

This 问题还不够。踢球者是 GROUP BY 与我需要的字段之一不同的字段,而没有 GROUP BYing 第二个字段,因为这会返回太多行(从我的示例数据集中,它将返回所有行)。

【问题讨论】:

  • 在预期的结果中,没有提到 datetime_created。就样本数据而言,您真的是指“GROUP BY field3”而不是“忽略字段 3”吗?
  • 我不需要datetime_created,但我需要idid2 GROUP BY id 以及最新的datetime_created 用于那个id。我收到的几个答案都理解了这个问题。
  • 是的,看来我看错了。没必要说我很笨。

标签: sql amazon-redshift


【解决方案1】:

使用row_number() over() 代替group by

SELECT
    id, id2, datetime_created
FROM (
    SELECT
        id, id2, datetime_created
      , ROW_NUMBER() OVER (PARTITION BY id ORDER BY datetime_created DESC) AS rn
    FROM table1
) d
WHERE rn = 1

这将使您可以访问具有最大日期时间值的整行

参考:ROW_NUMBER Window Function

【讨论】:

  • @ChootsMagoots 使用大写的 SQL 是一种偏好,而不是要求
  • 是的,但是我的老板和我的同事都不使用大写字母,而且我发现它更容易阅读......我不愿意让他们改变他们做事的方式,但是我确实觉得在这里提出要求很舒服,特别是因为我可以完成这项工作。小胜利:P
【解决方案2】:

您可以尝试以下方法:

SELECT id, id2
  FROM table
 WHERE (id, datetime_created) in
      (
        SELECT id, MAX(datetime_created)
          FROM table
         GROUP BY id
       )
ORDER BY id;

Rextester Demo [P.S.即使在 Oracle 中同样的逻辑也有效]

【讨论】:

    【解决方案3】:

    这可以帮助你:

    SELECT tt.id,tt.id2 FROM table tt LEFT JOIN (SELECT id, MAX(datetime_created) AS cr
              FROM table 
             GROUP BY id)q ON q.id=tt.id AND q.cr=tt.datetime_created WHERE q.id IS NOT NULL;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多