【问题标题】:SQL top 3 most recent records by groupSQL 按组排列的前 3 条最新记录
【发布时间】:2021-03-09 23:15:44
【问题描述】:

我有一个包含日期列和字符串列的表。我正在尝试将字符串列过滤为最近的 3 条记录。

+----------+--------------+
|   date   |    string    |
+----------+--------------+
|2000-11-14|           AAA|
|2009-11-07|           AAA|
|2020-11-20|           AAA|
|2019-11-07|           AAA|
|2018-11-07|           AAA|
|2020-11-22|           BBB|
|2019-11-20|           BBB|
|2018-11-20|           BBB|
|2014-11-21|           BBB|
|2016-11-22|           CCC|
|2017-11-08|           CCC|
|2018-11-07|           CCC|
|2019-11-22|           CCC|
|2020-11-09|           CCC|
|2020-11-11|           DDD|
+----------+--------------+

决赛桌如下所示:

+----------+--------------+
|   date   |    string    |
+----------+--------------+
|2020-11-20|           AAA|
|2019-11-07|           AAA|
|2018-11-07|           AAA|
|2020-11-22|           BBB|
|2019-11-20|           BBB|
|2018-11-20|           BBB|
|2020-11-09|           CCC|
|2019-11-22|           CCC|
|2018-11-07|           CCC|
|2020-11-11|           DDD|
+----------+--------------+

我认为我不能在这里按组使用MAX(date),因为我试图获得前 3 条最新记录(而不是前 1 条)。

【问题讨论】:

  • 您使用的是 MySQL 还是 Spark?它们不是一回事。
  • 对不起,我用的是 Spark

标签: mysql sql apache-spark


【解决方案1】:

ROW_NUMBER 解析函数特别适合此类问题:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY string ORDER BY date DESC) rn
    FROM yourTable
)

SELECT date, string
FROM cte
WHERE rn <= 3;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多