sql - 如何在 Snowflake SQL 中同时聚合并取一列的最后一个值?
问题描述
我需要聚合一些数据,同时获取其中一列的最后一个(按时间顺序排列的)值......
我可以用一个 CTE 来实现这一点,但想知道是否有更短/更有效的方法来做到这一点。
假设我卖杂货,并且在我的数据库中有“实际”销售额和“估计”销售额。
我想报告每种产品的总销售额,并返回最新的销售数字是 ACTUAL 还是 ESTIMATE。
这是我的 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;
我期待这个结果
解决方案
推荐阅读
- nightwatch.js - 我正在尝试使用带有 Nightwatch 的 PageObject 中的“链接文本”locateStrategy 配置元素
- python - 如何以 0x 为前缀并用 python 中的数字列表分隔
- c# - 用字符串格式伪造小数
- python - 查找压缩文本的长度(霍夫曼编码)
- c++ - QT中的LNK2019错误
- javascript - 从具有溢出内容的文本元素中获取文本仅返回文本的可见段
- ios - 如何在不经过序列的情况下在 GPUImage 中的视频上混合 2 个 LUT 的输出?
- java - 在 ANTLR 4 中写入命令不是可选的
- python - 如何在一系列输入中绘制张量流激活函数
- c# - 有可执行文件,但需要识别源代码