Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Snowflake SQL中聚合并同时获取一列的最后一个值?_Sql_Snowflake Cloud Data Platform - Fatal编程技术网

如何在Snowflake SQL中聚合并同时获取一列的最后一个值?

如何在Snowflake SQL中聚合并同时获取一列的最后一个值?,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我需要聚合一些数据,同时获取其中一列的最后一个(按时间顺序)值 我可以用一台CTE实现这一点,但我想知道是否有一种更短/更有效的方法来实现这一点 比如说,我卖杂货,数据库中既有“实际”销售额,也有“估计”销售额 我想报告每种产品的总销售额,并返回最新的销售数字是实际的还是估计的 这是我的CTE解决方案 CREATE OR REPLACE TABLE SALES_DATA (SOMETHING STRING NOT NULL

我需要聚合一些数据,同时获取其中一列的最后一个(按时间顺序)值

我可以用一台CTE实现这一点,但我想知道是否有一种更短/更有效的方法来实现这一点

比如说,我卖杂货,数据库中既有“实际”销售额,也有“估计”销售额

我想报告每种产品的总销售额,并返回最新的销售数字是实际的还是估计的

这是我的CTE解决方案

CREATE OR REPLACE TABLE SALES_DATA (SOMETHING         STRING NOT NULL
                                  , DATA_QUALITY      STRING NOT NULL
                                  , SALES             INTEGER
                                  , CREATED_ON        TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP()
                                  );

INSERT INTO SALES_DATA(SOMETHING, DATA_QUALITY, SALES, CREATED_ON)
  VALUES('CARROTS', 'ESTIMATE',  23, '2021-03-09 13:09')
      , ('BANANAS', 'ACTUAL',     5, '2021-03-09 13:34')
      , ('CARROTS', 'ACTUAL',    12, '2021-03-09 14:09')
      , ('ORANGES', 'ACTUAL',    24, '2021-03-10 13:09')
      , ('BANANAS', 'ESTIMATE',  14, '2021-03-11 00:00')
  ;
  
-- At leaf level, just ensure all rows report the latest Data Quality instead of that of the row itself
WITH LATEST_DATA_QUALITY_ONLY
AS (
SELECT  SOMETHING
      , SALES
      , LAST_VALUE(DATA_QUALITY) OVER(PARTITION BY SOMETHING ORDER BY CREATED_ON) AS LATEST_DATA_QUALITY
  FROM SALES_DATA
)
SELECT SOMETHING
      ,MAX(LATEST_DATA_QUALITY) AS LATEST_DATA_QUALITY
      ,SUM(SALES) AS SALES
  FROM LATEST_DATA_QUALITY_ONLY 
  GROUP BY SOMETHING
  ORDER BY SOMETHING;
我期待这个结果

使用创建数组,按创建的
排序并访问第一个元素:

SELECT SOMETHING
  ,(ARRAY_AGG(LATEST_DATA_QUALITY) WITHIN GROUP(ORDER BY CREATED_ON DESC))[0] 
    AS LATEST_DATA_QUALITY
  ,SUM(SALES) AS SALES   
FROM LATEST_DATA_QUALITY_ONLY    
GROUP BY SOMETHING   
ORDER BY SOMETHING;

此模式尝试模拟子句。

您可以将问题转到其头部,并在分区上加窗求和,然后通过限定符仅保留最后一行:

SELECT something
    ,data_quality AS latest_data_quality
    ,SUM(sales) OVER (PARTITION BY something ORDER BY created_on range between unbounded preceding and unbounded following) as sales
FROM sales_data
QUALIFY ROW_NUMBER() OVER (PARTITION BY something ORDER BY created_on DESC) = 1
ORDER BY something, created_on;

我不得不调整一些细节,但它确实可以在组内(ORDER BY CREATED_ON DESC)选择一些内容(ARRAY_AGG(DATA_QUALITY))[0]作为最新的_DATA_QUALITY,SUM(SALES)作为SALES_DATA GROUP中的销售额,按订单排序@埃里克马梅:我很高兴听到:)太棒了。还有一点东西要我学习!谢谢我试着接受两个答案,但看起来我只能选择一个。。。非常感谢