sql - SQL - 雪花 - 内部联接未按预期工作
问题描述
我ADS
在雪花中有一张像这样的表(每天都在插入数据),请注意第 3 行和第 4 行有重复条目:
ID | 报告日期 | 点击 | 印象 |
---|---|---|---|
1 | 1月01日 | 20 | 400 |
1 | 1月2日 | 25 | 600 |
1 | 1月3日 | 80 | 900 |
1 | 1月3日 | 80 | 900 |
2 | 1月01日 | 30 | 500 |
2 | 1月2日 | 55 | 650 |
2 | 1月3日 | 90 | 950 |
我想根据ID
最大值选择所有条目REPORT_DATE
- 基本上我想知道每个条目的最新CLICKS
数量:IMPRESSIONS
ID
ID | 报告日期 | 点击 | 印象 |
---|---|---|---|
1 | 1月3日 | 80 | 900 |
2 | 1月3日 | 90 | 950 |
DATE
这个查询成功地给了我每个的最大值ID
:
SELECT
MAX(REPORT_DATE),
ID
FROM ADS
GROUP BY
ID;
结果:
ID | MAX(报告_日期) |
---|---|
1 | 1月3日 |
2 | 1月3日 |
但是,当我尝试进行内部连接时,会出现重复项:
SELECT
a.ID,
a.REPORT_DATE,
a.CLICKS,
a.IMPRESSIONS
FROM ADS a
INNER JOIN (
SELECT
MAX(REPORT_DATE),
ID
FROM ADS
GROUP BY
ID
) b
ON a.ID = b.ID
AND a.REPORT_DATE = b.REPORT_DATE;
结果:
ID | 报告日期 | 点击 | 印象 |
---|---|---|---|
1 | 1月3日 | 80 | 900 |
1 | 1月3日 | 80 | 900 |
2 | 1月3日 | 90 | 950 |
如何构建查询以删除这些重复项?
解决方案
你可以使用QUALIFY
and ROW_NUMBER()
:
SELECT a.ID,a.REPORT_DATE,a.CLICKS,a.IMPRESSIONS
FROM ADS a
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY REPORT_DATE DESC) = 1;
请注意,这ORDER BY REPORT_DATE
是不稳定的(在平局的情况下)。我建议添加另一列进行排序,即元组始终是唯一的。
如果有平局的行是相同的,这实际上不是问题。
推荐阅读
- python - 如何在几个嵌套列表上迭代一个爬虫?
- python - 如何使用 CloudWatch 警报获取 EC2 实例列表?
- r - relevel.default(delays.df$ORIGIN, ref = "IAD") 中的错误:'relevel' 仅适用于(无序)因素
- postgresql - 带有 postgres 的 DOCKER 容器,警告:无法打开统计文件“pg_stat_tmp/global.stat”:不允许操作
- python - 在python中为KMeans生成所有特征组合
- amazon-web-services - aws-sdk 使用 IAM Auth 发送请求
- javascript - URL.createObjectURL(blob);
- mongodb - mongoose ref 只返回数组中的一个元素
- c++ - 使用来自另一个线程的 boost asio 服务器会话
- python - 如何创建一个列表来存储更改函数的所有先前值