当两个查询应该相等时返回不同的结果?

维克

我们的数据集从根本上将一组日期(从当前周到过去的几周)加入到一组节中,具体取决于这些节是在该周开始或之前,然后在该周或之后结束。虽然此查询最初为我们提供了预期的结果,但本周开始为我们提供了错误的结果。经过一堆修补后,我们发现如果将查询更改为a LEFT JOIN,然后使用WHERE子句过滤查询,它将再次为我们提供正确的结果。

有什么不同?为什么一个起作用而另一个不起作用?要点:为什么原始查询在突然遇到此错误之前要工作几周?)在Redshift上执行相同的内部联接会产生正确的结果,因此这似乎是我们不了解的Snowflake细微差别。

原始查询:

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周前)。过去三周没有数据。

注意:如果您DATEADD在第一个CTE中进行了调整,则返回的第一个日期无论是什么,似乎总是可以成功加入。此行为仅在最后一周内开始-以前,此查询提供了预期的行数(换句话说,该行指定了第一个星期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-01-20的周,并带有适当的节计数。

维克

感谢您的所有反馈!好消息是,你们所有人都帮助我找到了令我满意的解决方案。我还跟踪了Snowflake,以便他们可以调查此行为,并查看这是否是我的用户错误,原因是不了解递归CTE的处理方式,或者它是否可能是最近发行版中引入的错误。

这是我发现的内容:虽然递归适用于我将其应用到的用例(基于生成日期列表CURRENT_DATE),但并非绝对必要。由于我们需要日期列表,因此我可以轻松地生成一个表格并使用行号来进行DATEADD调整。

看起来像这样:

SELECT DATEADD(week, '-' || ROW_NUMBER() OVER (ORDER BY NULL), 
               DATEADD(week, 1, DATE_TRUNC(week, CURRENT_DATE()))) AS week_value
FROM table (generator(rowcount => 200))

这种方法的最大好处之一是,我不再受限MAX_RECURSIONS于Snowflake中设置(默认情况下设置为100)。由于我使用这些数据来创建随时间变化的活动图,因此拥有200个值使我拥有超过三年的历史,而不仅仅是两年的历史。如果我想扩大我的Snowflake代表,也不必联系它。

week_listCTE更改为这种非递归方法似乎可以解决导致CTE无法INNER JOIN正确执行的任何问题我们仍然不明白为什么递归CTE似乎工作了好几周然后突然开始出现异常,但是如果Snowflake可以通过我们的支持票证来阐明这一点,我将在这里加倍提供更新。谢谢大家的帮助和指导!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

结合两个仅返回结果不同的LINQ查询

来自分类Dev

两个查询返回不同的结果计数

来自分类Dev

是什么让这两个查询返回不同的结果?

来自分类Dev

嵌套的“ while”循环需要根据两个相等的查询结果返回信息

来自分类Dev

两个查询返回不同的数据

来自分类Dev

两个sqlalchemy查询返回相同的结果,即使它们具有不同的过滤器

来自分类Dev

两个(在我看来)等效的SQL查询返回不同的结果

来自分类Dev

针对相同的Entity Framework DbSet的两个不同的LINQ查询,均返回相同的结果

来自分类Dev

查询以获取两个不同查询结果的差值

来自分类Dev

这两个查询如何返回相同的结果但使用不同的联接?(隐式查询与显式查询)

来自分类Dev

当仅更改字段,值时,oracle为两个相同的查询产生不同的结果

来自分类Dev

当使用两个不同的公钥时,为什么pycrypto返回相同的加密结果?

来自分类Dev

C++:两个单独的函数在嵌套时返回不同的结果?

来自分类Dev

在Django中查询相同模型时如何返回两个不同的错误消息

来自分类Dev

尽管两个查询看起来具有相同的逻辑,但 Solr 查询返回不同的结果

来自分类Dev

如何将两个不同查询的结果相乘

来自分类Dev

为什么两个查询的结果不同

来自分类Dev

如何将两个不同查询的结果相乘

来自分类Dev

如何使用 UNION 添加两个不同查询的结果

来自分类Dev

cmp根据评估方法返回两个不同的结果

来自分类Dev

比较两个名称并返回X字符不同的结果

来自分类Dev

使用console.log的两个不同结果并返回

来自分类Dev

比较两个查询的结果并返回缺少的行

来自分类Dev

合并两个查询的日志类型功能的返回结果

来自分类Dev

使用两个 Laravel 模型查询并返回结果

来自分类Dev

为什么这个 javascript 函数为同一个查询返回两个不同的结果?

来自分类Dev

两个不同的特殊字符相等

来自分类Dev

如果两个查询相等则插入

来自分类Dev

两个LINQ查询返回不同的数据类型

Related 相关文章

  1. 1

    结合两个仅返回结果不同的LINQ查询

  2. 2

    两个查询返回不同的结果计数

  3. 3

    是什么让这两个查询返回不同的结果?

  4. 4

    嵌套的“ while”循环需要根据两个相等的查询结果返回信息

  5. 5

    两个查询返回不同的数据

  6. 6

    两个sqlalchemy查询返回相同的结果,即使它们具有不同的过滤器

  7. 7

    两个(在我看来)等效的SQL查询返回不同的结果

  8. 8

    针对相同的Entity Framework DbSet的两个不同的LINQ查询,均返回相同的结果

  9. 9

    查询以获取两个不同查询结果的差值

  10. 10

    这两个查询如何返回相同的结果但使用不同的联接?(隐式查询与显式查询)

  11. 11

    当仅更改字段,值时,oracle为两个相同的查询产生不同的结果

  12. 12

    当使用两个不同的公钥时,为什么pycrypto返回相同的加密结果?

  13. 13

    C++:两个单独的函数在嵌套时返回不同的结果?

  14. 14

    在Django中查询相同模型时如何返回两个不同的错误消息

  15. 15

    尽管两个查询看起来具有相同的逻辑,但 Solr 查询返回不同的结果

  16. 16

    如何将两个不同查询的结果相乘

  17. 17

    为什么两个查询的结果不同

  18. 18

    如何将两个不同查询的结果相乘

  19. 19

    如何使用 UNION 添加两个不同查询的结果

  20. 20

    cmp根据评估方法返回两个不同的结果

  21. 21

    比较两个名称并返回X字符不同的结果

  22. 22

    使用console.log的两个不同结果并返回

  23. 23

    比较两个查询的结果并返回缺少的行

  24. 24

    合并两个查询的日志类型功能的返回结果

  25. 25

    使用两个 Laravel 模型查询并返回结果

  26. 26

    为什么这个 javascript 函数为同一个查询返回两个不同的结果?

  27. 27

    两个不同的特殊字符相等

  28. 28

    如果两个查询相等则插入

  29. 29

    两个LINQ查询返回不同的数据类型

热门标签

归档