【问题标题】:How can I get the count and newest record for each pair of columns?如何获取每对列的计数和最新记录?
【发布时间】:2019-08-28 09:08:41
【问题描述】:

我有一个包含 4 列 (A, B, C, D) 的 Athena 表,我想找到:

  1. A & B 的每个唯一组合关联的行数
  2. 同一 AB 对的最近行的 C 值,其中 D 是时间戳

例如,如果这是输入数据

+---+---+-----+------------+
| A | B |  C  |     D      |
+---+---+-----+------------+
| 1 | 1 | 'a' | 2019-04-04 |
| 1 | 1 | 'b' | 2019-04-03 |
| 1 | 2 | 'c' | 2019-04-02 |
| 1 | 3 | 'd' | 2019-04-01 |
| 2 | 2 | 'e' | 2019-04-03 |
| 2 | 2 | 'f' | 2019-04-04 |
+---+---+-----+------------+

这是想要的输出

+---+---+----------+-------+
| A | B | newest_C | count |
+---+---+----------+-------+
| 1 | 1 | 'a'      |     2 |
| 1 | 2 | 'c'      |     1 |
| 1 | 3 | 'd'      |     1 |
| 2 | 2 | 'f'      |     2 |
+---+---+----------+-------+

我不擅长查询,我的最佳尝试如下:

加入两个子查询,其中一个进行计数,另一个按时间对每一行进行排名。然后在连接上,只选择排名最高的行。

WITH t1 AS (
    SELECT A, B, count(*)
    FROM data
    GROUP BY A, B
),
t2 AS (
    SELECT A, B, C, RANK() OVER (PARTITION BY A, B ORDER BY D DESC) AS rank
    FROM data
)
SELECT t1.A, t1.B, t2.newest_C, t1.count
FROM t1 LEFT JOIN t2 ON t1.A = t2.A AND t1.B = t2.B
WHERE rank = 1

【问题讨论】:

    标签: sql amazon-athena presto


    【解决方案1】:

    这可以使用Presto window functions来实现:

    SELECT a, b, c AS newest_c, cnt
    FROM (
        SELECT 
            t.*,
            COUNT(*)     OVER(PARTITION BY a, b) AS cnt,
            ROW_NUMBER() OVER(PARTITION BY a, b ORDER BY d DESC) AS rn
        FROM mytable t
    ) x WHERE rn = 1
    

    在子查询中,可以使用窗口函数来统计具有相同(a, b)元组的记录数,并对记录进行降序排列d。然后,外部查询过滤每个组中的最新记录。

    【讨论】:

    • 感谢您的建议!这比我的查询快得多。想知道为什么使用窗口函数比连接更快吗?我会认为进行窗口计算会比进行分组要慢。
    【解决方案2】:

    Presto 具有一些复杂的聚合功能。所以:

    select a, b, count(*) as cnt,
           max_by(c, d)
    from t
    group by a, b;
    

    max_by()documentation 中有解释。

    【讨论】:

      【解决方案3】:

      Gordon Linoff 的解决方案没问题。如果您不想使用 max_by,另一种选择:

      SELECT t1.a, t1.b, t1.c, t2.count
      FROM data AS t1 
      INNER JOIN
        (SELECT a, b, count(*) AS count, max(d) AS d 
        FROM data 
        GROUP BY a,b) AS t2
      ON t1.a = t2.a AND t1.b = t2.b AND t1.d = t2.d
      

      这里是a demo!

      【讨论】:

      • 感谢您的建议!想知道为什么这会比 Gordon Lindoff 的建议更好?
      • 不是更好!哈哈,我认为这是唯一更标准的 SQL。
      猜你喜欢
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      相关资源
      最近更新 更多