SQL - 雪花 - 内部连接未按预期工作
SQL - Snowflake - Inner Join not working as expected
我在雪花中有一个 table ADS
像这样(每天插入数据),请注意第 3 行和第 4 行有重复的条目:
ID
REPORT_DATE
点击次数
印象
1
1 月 1 日
20
400
1
1 月 2 日
25
600
1
1 月 3 日
80
900
1
1 月 3 日
80
900
2
1 月 1 日
30
500
2
1 月 2 日
55
650
2
1 月 3 日
90
950
我想 select 基于 ID
的所有条目,最大 REPORT_DATE
- 基本上我想知道 CLICKS
和 [=17= 的最新数量] 每个 ID
:
ID
REPORT_DATE
点击次数
印象
1
1 月 3 日
80
900
2
1 月 3 日
90
950
此查询成功为我提供了每个 ID
:
的最大值 DATE
SELECT
MAX(REPORT_DATE),
ID
FROM ADS
GROUP BY
ID;
结果:
ID
MAX(REPORT_DATE)
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
REPORT_DATE
点击次数
印象
1
1 月 3 日
80
900
1
1 月 3 日
80
900
2
1 月 3 日
90
950
如何构造我的查询以删除这些重复项?
您可以使用 QUALIFY
和 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
不稳定(在平局的情况下)。我建议添加另一列进行排序,即元组始终是唯一的。
如果有平局的行相同,那实际上不是问题。
您可以使用row_number()
window函数:
select id, report_date, clicks, impresions from
(
select id, report_date, clicks, impresions, row_number()over(partition by id order
by report_date desc) rnk from ADs
)t
where rn=1
我在雪花中有一个 table ADS
像这样(每天插入数据),请注意第 3 行和第 4 行有重复的条目:
ID | REPORT_DATE | 点击次数 | 印象 |
---|---|---|---|
1 | 1 月 1 日 | 20 | 400 |
1 | 1 月 2 日 | 25 | 600 |
1 | 1 月 3 日 | 80 | 900 |
1 | 1 月 3 日 | 80 | 900 |
2 | 1 月 1 日 | 30 | 500 |
2 | 1 月 2 日 | 55 | 650 |
2 | 1 月 3 日 | 90 | 950 |
我想 select 基于 ID
的所有条目,最大 REPORT_DATE
- 基本上我想知道 CLICKS
和 [=17= 的最新数量] 每个 ID
:
ID | REPORT_DATE | 点击次数 | 印象 |
---|---|---|---|
1 | 1 月 3 日 | 80 | 900 |
2 | 1 月 3 日 | 90 | 950 |
此查询成功为我提供了每个 ID
:
DATE
SELECT
MAX(REPORT_DATE),
ID
FROM ADS
GROUP BY
ID;
结果:
ID | MAX(REPORT_DATE) |
---|---|
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 | REPORT_DATE | 点击次数 | 印象 |
---|---|---|---|
1 | 1 月 3 日 | 80 | 900 |
1 | 1 月 3 日 | 80 | 900 |
2 | 1 月 3 日 | 90 | 950 |
如何构造我的查询以删除这些重复项?
您可以使用 QUALIFY
和 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
不稳定(在平局的情况下)。我建议添加另一列进行排序,即元组始终是唯一的。
如果有平局的行相同,那实际上不是问题。
您可以使用row_number()
window函数:
select id, report_date, clicks, impresions from
(
select id, report_date, clicks, impresions, row_number()over(partition by id order
by report_date desc) rnk from ADs
)t
where rn=1