【发布时间】:2020-01-27 23:20:40
【问题描述】:
我们的数据集从根本上将一组日期(从本周到过去的周数)连接到一组部分,具体取决于这些部分是在该周开始或之前开始,还是在该周或之后结束。虽然最初这个查询给了我们预期的结果,但本周它开始给我们提供不正确的结果。经过一番修改,我们发现如果我们将查询更改为LEFT JOIN,然后使用WHERE 子句过滤查询,它再次给了我们正确的结果。
有什么区别?为什么一个有效而另一个无效? (加分:为什么原始查询工作了数周才突然出现此错误?)在 Redshift 上执行相同的内部联接可提供正确的结果,因此这似乎是我们不知道的雪花细微差别明白。
原始查询:
WITH week_list AS
(
SELECT DATEADD(week, -4, DATE_TRUNC(week, CURRENT_DATE())) AS week_value
UNION ALL
SELECT DATEADD(week, 1, week_value)
FROM week_list
WHERE DATEADD(week, 1, week_value) < CURRENT_DATE()
),
active_sections_per_week AS
(
SELECT
wl.week_value, s.id section_id
FROM week_list wl
JOIN schema.sections s ON wl.week_value >= DATE_TRUNC(week, s.starts_at)
AND wl.week_value <= DATE_TRUNC(week, s.ends_at)
)
SELECT
aspw.week_value,
COUNT(DISTINCT aspw.section_id) count_sections
FROM
active_sections_per_week aspw
GROUP BY 1
ORDER BY 1 DESC
结果:一行,日期为 2019 年 12 月 30 日(4 周前)。没有过去三周的数据。
注意:如果您在第一个 CTE 中调整 DATEADD,无论返回的第一个日期是什么,似乎总是会成功加入。此行为仅在上周开始 - 以前,此查询提供了预期的行数(换句话说,第一个 DATEADD 中指定的周数)。
“固定”查询:
WITH week_list AS
(
SELECT DATEADD(week, -4, DATE_TRUNC(week, CURRENT_DATE())) AS week_value
UNION ALL
SELECT DATEADD(week, 1, week_value)
FROM week_list
WHERE DATEADD(week, 1, week_value) < CURRENT_DATE()
),
active_sections_per_week AS
(
SELECT wl.week_value, s.id section_id
FROM week_list wl
LEFT JOIN schema.sections s ON wl.week_value >= DATE_TRUNC(week, s.starts_at)
AND wl.week_value <= DATE_TRUNC(week, s.ends_at)
WHERE s.id IS NOT NULL
)
SELECT aspw.week_value, COUNT(DISTINCT aspw.section_id) count_sections
FROM active_sections_per_week aspw
GROUP BY 1
ORDER BY 1 DESC
结果:返回四行,日期为 2019 年 12 月 30 日至 2020 年 1 月 20 日的周数,包含适当的节数。
【问题讨论】:
-
这可能是一个愚蠢的问题,但是您是否有一个名为
week_list的表以及一个同名的 CTE? -
仅用于检查视图合并是否正在发生如果您在 active_sections_per_week 中添加“WHERE 1=1”会在原始查询中发生什么
-
好问题@MikeWalton!我没有单独的同名表,
week_list这里总是指 CTE。 -
感谢@GeorgeJoseph 的建议!我尝试在
active_sections_per_weekCTE 中添加WHERE 1=1,但结果相同(仅返回一周)。 -
如果你尝试 WHERE CURRENT_DATE() = CURRENT_DATE() 祝你好运
标签: sql inner-join snowflake-cloud-data-platform