在雪花的临时表中计算大小写

Posted

技术标签:

【中文标题】在雪花的临时表中计算大小写【英文标题】:Having count with case when in a temporary table in snowflake 【发布时间】:2020-02-26 14:59:20 【问题描述】:

我正在尝试根据具有计数条件进行查询以返回一个表,如果行数 > 2,那么它应该只返回一个字段的最大值并与另一个表进行联合。如果它等于 1,那么只需拉出表格的所有内容,它看起来有点像这样,我不知道雪花的正确语法:

WITH TEMP_SHIPMENTS AS (
    SELECT 
      ORDERNUMBER,
      POSITIONNUMBER,
      ITEMCODE,
      ITEMDESCRIPTION,
      SHIPMENTNUMBER,
      LOAD,
      QUANTITY,
      SERIALNUMBER,
      CUSTOMERNAME,
      SHIPTOADDRESS,
      MAX(CUSTOMERORDER),
      CUSTOMERLINE,
      DELIVERYDATE
    FROM 
        T_SHIPMENTS


    GROUP BY
        ORDERNUMBER,
      POSITIONNUMBER,
      ITEMCODE,
      ITEMDESCRIPTION,
      SHIPMENTNUMBER,
      LOAD,
      QUANTITY,
      SERIALNUMBER,
      CUSTOMERNAME,
      SHIPTOADDRESS,
      CUSTOMERORDER,
      CUSTOMERLINE,
      DELIVERYDATE
)
CASE WHEN HAVING COUNT FROM TEMP_SHIPMENTS.CUSTOMERORDER >2
THEN
SELECT ORDERNUMBER,
      POSITIONNUMBER,
      ITEMCODE,
      ITEMDESCRIPTION,
      SHIPMENTNUMBER,
      LOAD,
      QUANTITY,
      SERIALNUMBER,
      CUSTOMERNAME,
      SHIPTOADDRESS,
      CUSTOMERORDER,
      CUSTOMERLINE,
      MAX(DELIVERYDATE) 
FROM TEMP_SHIPMENTS;

关于如何实现它的任何想法?

 SELECT 
      ORDERNUMBER,
      POSITIONNUMBER,
      ITEMCODE,
      ITEMDESCRIPTION,
      SHIPMENTNUMBER,
      LOAD,
      QUANTITY,
      SERIALNUMBER,
      CUSTOMERNAME,
      SHIPTOADDRESS,
      CUSTOMERORDER,
      CUSTOMERLINE,
      DELIVERYDATE
    FROM 
        T_SHIPMENTS
    WHERE SerialNumber = '012501003449'   ;

Result table from query 我把结果留在这里,你可以看到我有相同的序列号和两条记录,这没关系,但我只需要一个。那将是具有最大日期时间或最大客户订单号的那个。我尝试用最大值查询,但在这两个字段中都没有得到任何结果,我仍然得到两条记录,而不仅仅是一条具有最大值的记录

【问题讨论】:

样本数据和期望的结果会有所帮助。 我刚刚为它添加了一个编辑和一张图片,谢谢 【参考方案1】:

如果您想返回MAX(CUSTOMERORDER) 的行,我会尝试:

WITH TEMP_SHIPMENTS AS (
    SELECT ROW_NUMBER() over (PARTITION BY SERIALNUMBER ORDER BY CUSTOMERORDER desc) row_num,
      ORDERNUMBER,
      POSITIONNUMBER,
      ITEMCODE,
      ITEMDESCRIPTION,
      SHIPMENTNUMBER,
      LOAD,
      QUANTITY,
      SERIALNUMBER,
      CUSTOMERNAME,
      SHIPTOADDRESS,
      CUSTOMERORDER,
      CUSTOMERLINE,
      DELIVERYDATE
    FROM 
        T_SHIPMENTS
)

SELECT *
FROM TEMP_SHIPMENTS
WHERE row_num = 1

您的问题不清楚这是否应该是整个表格的最大 ordernumber 或组的最大 ordernumber - 根据您附加的图像,听起来您想要每个 @987654326 的最大 ordernumber @,所以这就是我划分的内容。但是,如果您希望商品或客户的最大 ordernumber 分别为,您可以将该分区设置为 itemdescriptioncustomername

【讨论】:

这实际上效果很好,我不知道雪花中的 partition by 子句。是的,这是每个序列号的最大订单号。非常感谢您的帮助【参考方案2】:

恐怕你不能真正在任何数据库的纯 SQL 中进行条件联合,也不能将 HAVING 子句用于除分组结果细化之外的任何其他事情。

【讨论】:

以上是关于在雪花的临时表中计算大小写的主要内容,如果未能解决你的问题,请参考以下文章

雪花 - Azure 文件上传 - 如果文件大小超过 40MB,我如何对文件进行分区

雪花我们如何遍历临时表的每一行并将其值插入到另一个表中,其中每个字段的值都是单行?

2个雪花表,数据相同,大小不同

雪花 - 无法将暂存区域中的 JSON 拆分文件复制到表中

跨区域的雪花复制:增加任一端的仓库大小会影响速度吗?

如何自动向上/向下调整雪花仓库的大小?