gpt4 book ai didi

sql - 如何在 Snowflake SQL 中同时聚合和取一列的最后一个值?

转载 作者:行者123 更新时间:2023-12-04 07:45:08 27 4
gpt4 key购买 nike

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

我可以通过一个 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;

我期待这个结果

enter image description here

最佳答案

使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com