我需要聚合一些数据,同时获取其中一列的最后一个(按时间顺序排列的)值...
我可以通过一个 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;
我期待这个结果
最佳答案
使用 ARRAY_AGG创建按 CREATED_ON
排序的数组并访问第一个元素:
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;
这个模式试图模仿 KEEP条款。
关于sql - 如何在 Snowflake SQL 中同时聚合和取一列的最后一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67233688/