【问题标题】:Snowflake Left Join with date range雪花左加入日期范围
【发布时间】:2020-01-29 21:34:17
【问题描述】:

我正在努力处理带有日期范围的雪花数据库 LEFT JOIN 查询。请在下面找到示例表内容

我的 Snowflake SQL 查询: 选择 O.ORDER_DATE, CASE WHEN ORDER_DATE 为 NULL THEN 'NO' ELSE 'YES' END AS ORDER_PLACED, C.CUSTOMER_ID, C.NAME 来自客户 C C.CUSTOMER_ID=O.CUSTOMER_ID 上的左连接订单 AND O.ORDER_DATE >= DATEADD(DAY, -3, CURRENT_DATE)

我期望的输出 - 我想获得所有客户最近 3 天的记录以及他们是否下订单,如下所示

我通过给定的雪花查询得到的当前数据输出是

我不知道问题是否出在日期范围上(无论如何我都需要日期范围),因为我在第一天就得到了所需的结果。但是在剩下的日子里,我只会在下订单时得到这些记录。如预期结果所示,我想获取所有客户记录以及他们是否下订单等详细信息。

提前致谢

【问题讨论】:

  • 请不要发布图片!
  • 只是扫描这个,但您是否尝试过删除“LEFT”并使用内部连接?
  • 每位客户最近 3 天的订单还是过去 3 天内的订单?
  • 您似乎想要来自客户表的所有记录,并在过去三天内显示“已下订单”。如果是这种情况,那么 LEFT JOIN 是正确的,但是,您将删除 3 天前下订单的客户。
  • use text, not images/links, for text--including tables & ERDs. 转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图像中包含图例/键和说明。请在发布之前查看编辑框下方帖子的格式化版本。阅读代码和引文的内联和块格式的编辑帮助。

标签: sql database left-join snowflake-cloud-data-platform


【解决方案1】:

应该是ORDER_DATE 还是CALENDAR_DATE 驱动查询? 如果某一天没有人下单,他们应该在ORDER_PLACED 列中都有NO 吗?

如果是这样,请对Gordon Linoff 的答案进行一些更改:

SELECT d.CAL_DATE, DECODE(COUNT(o.ORDER_ID), 0, 'NO', 'YES') ORD_PLCD, c.CUSTOMER_ID, c.NAME
FROM (
    SELECT DATEADD(DAYS, -SEQ1(), CURRENT_DATE) CAL_DATE
    FROM TABLE(GENERATOR(ROWCOUNT => 4))
) d
CROSS JOIN CUSTOMER c
LEFT OUTER JOIN ORDERS o ON o.ORDER_DATE = d.CAL_DATE AND o.CUSTOMER_ID = c.CUSTOMER_ID
GROUP BY d.CAL_DATE, c.CUSTOMER_ID, c.NAME

【讨论】:

    【解决方案2】:

    使用cross join 生成行,然后使用left join 引入结果:

    SELECT O.CTE, C.CUSTOMER_ID, C.NAME,
           MAX(CASE WHEN O.CUSTOMER_ID IS NULL THEN 'NO' ELSE 'YES' END) AS ORDER_PLACED, 
    FROM CUSTOMER C CROSS JOIN
         (SELECT DISTINCT O.ORDER_DATE AS dte
          FROM ORDERS O
          WHERE O.ORDER_DATE >= DATEADD(DAY, -3, CURRENT_DATE)
         ) D LEFT JOIN
         ORDERS
         ON C.CUSTOMER_ID =  AND AND D.DTE = O.ORDER_DATE
    GROUP BY O.CTE, C.CUSTOMER_ID, C.NAME;
    

    当然,您可以明确列出 d 派生表的日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2020-05-23
      • 2022-01-23
      • 1970-01-01
      • 2016-10-14
      • 2017-04-27
      • 2011-01-19
      相关资源
      最近更新 更多