【问题标题】:How do you get the last entry for each month in SQL?如何在 SQL 中获取每个月的最后一个条目?
【发布时间】:2022-10-19 23:08:43
【问题描述】:

我希望将非常大的表过滤为每个用户每月的最新条目。我不确定我是否找到了最好的方法来做到这一点。我知道我“应该”信任 SQL 引擎(雪花),但我的一部分不喜欢三列的连接。

请注意,这是在许多大表上非常常见的操作,我想在 DBT 视图中使用它,这意味着它将一直运行。

为了说明,我的数据是这种形式:

mytable

userId loginDate year month value
1 2021-01-04 2021 1 41.1
1 2021-01-06 2021 1 411.1
1 2021-01-25 2021 1 251.1
2 2021-01-05 2021 1 4369
2 2021-02-06 2021 2 32
2 2021-02-14 2021 2 731
3 2021-01-20 2021 1 258
3 2021-02-19 2021 2 4251
3 2021-03-15 2021 3 171

我正在尝试使用 SQL 来获取每个月的最后一个值(通过 loginDate)。

我目前正在按以下方式进行 groupby 和 join:

WITH latest_entry_by_month AS (
    SELECT "userId", "year", "month", max("loginDate") AS "loginDate"
    FROM mytable
)

SELECT * FROM mytable NATURAL JOIN latest_entry_by_month 

以上结果是我想要的输出:

userId loginDate year month value
1 2021-01-25 2021 1 251.1
2 2021-01-05 2021 1 4369
2 2021-02-14 2021 2 731
3 2021-01-20 2021 1 258
3 2021-02-19 2021 2 4251
3 2021-03-15 2021 3 171

但我不确定它是否是最佳的。

关于如何更快地做到这一点的任何指导?请注意,我没有具体化基础数据,因此它实际上是非集群的(我通过 Snowflake 市场从供应商处获取它)。

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    使用QUALIFY

    SELECT *
    FROM mytable
    QUALIFY ROW_NUMBER() OVER(PARTITION BY user_id, year, month 
                              ORDER BY loginDate DESC) = 1
    

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2011-07-22
      相关资源
      最近更新 更多