如何在Snowflake SQL中聚合并同时获取一列的最后一个值?
我需要聚合一些数据,同时获取其中一列的最后一个(按时间顺序)值 我可以用一台CTE实现这一点,但我想知道是否有一种更短/更有效的方法来实现这一点 比如说,我卖杂货,数据库中既有“实际”销售额,也有“估计”销售额 我想报告每种产品的总销售额,并返回最新的销售数字是实际的还是估计的 这是我的CTE解决方案如何在Snowflake SQL中聚合并同时获取一列的最后一个值?,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我需要聚合一些数据,同时获取其中一列的最后一个(按时间顺序)值 我可以用一台CTE实现这一点,但我想知道是否有一种更短/更有效的方法来实现这一点 比如说,我卖杂货,数据库中既有“实际”销售额,也有“估计”销售额 我想报告每种产品的总销售额,并返回最新的销售数字是实际的还是估计的 这是我的CTE解决方案 CREATE OR REPLACE TABLE SALES_DATA (SOMETHING STRING NOT NULL
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中的销售额,按订单排序@埃里克马梅:我很高兴听到:)太棒了。还有一点东西要我学习!谢谢我试着接受两个答案,但看起来我只能选择一个。。。非常感谢