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

标签 sql snowflake-cloud-data-platform

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

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

相关文章:

mysql - 我需要一个 SQL 查询,它根据 C 列中是否存在字符串从 A 列或 B 列中进行选择

sql - 选择第一个和最后一个元素的最有效方法,SQLite?

mysql - 将 null 更新为 not null

snowflake-cloud-data-platform - 雪花任务失败通知

Azure Blob 存储 - SAS - 数据工厂

php - 检查空白数组时出现什么问题?

mysql - SELECT 和 JOIN 花费的时间太长

snowflake-cloud-data-platform - 在Snowflake中,为什么同时分配两个变量时,变量有256字节的限制?

snowflake-cloud-data-platform - Snowflake - 如何创建包含唯一记录的汇总表

oracle - Snowflake 中的 dbms_random.value() - Oracle 到雪花的转换