【发布时间】: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