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

如何构造我的查询以删除这些重复项?

您可以使用 QUALIFYROW_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