首页 > 解决方案 > 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数量:IMPRESSIONSID

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

如何构建查询以删除这些重复项?

标签: sqlinner-joinsnowflake-cloud-data-platform

解决方案


你可以使用QUALIFYand 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是不稳定的(在平局的情况下)。我建议添加另一列进行排序,即元组始终是唯一的。

如果有平局的行是相同的,这实际上不是问题。


推荐阅读