SQL 对分区上的不同计数进行累积

标签 sql amazon-athena

我正在使用 AWS Athena(基于 Presto),并且该表名为 base :

<表类=“s-表”> <标题> id 类别 年 月 <正文> 1 一个 2021 6 1 b 2022 8 1 一个 2022 11 2 一个 2022 1 2 一个 2022 4 2 b 2022 6

我想制作一个查询,计算每个 id 的类别的不同值,每月和每年累计,但保留原始列:

<表类=“s-表”> <标题> id 类别 年 月 总和 <正文> 1 一个 2021 6 1 1 b 2022 8 2 1 一个 2022 11 2 2 一个 2022 1 1 2 一个 2022 4 1 2 b 2022 6 2

我尝试执行以下查询但没有成功:

SELECT id, 
       category, 
       year, 
       month, 
       COUNT(category) OVER (PARTITION BY id, ORDER BY year, month) AS sumC FROM base;

这会导致 1, 2, 3, 1, 2, 3这不是我要找的。我宁愿需要类似 COUNT(DISTINCT) 的东西在窗口函数内,尽管不支持将其作为构造。

我还尝试了 DENSE_RANK技巧:

  DENSE_RANK() OVER (PARTITION BY id ORDER BY category) 
+ DENSE_RANK() OVER (PARTITION BY id ORDER BY category) 
- 1 as sumC

但是,因为 year 之间没有顺序和month ,它只会导致 2, 2, 2, 2, 2, 2 .

感谢任何帮助!

最佳答案

一个选项是

  • 创建一个新列,其中将包含第一次看到每个“类别”的时间(按“id”、“类别”分区>”并按“”、“”排序)
  • 使用相同分区计算此列的运行总和
WITH cte AS (
    SELECT *, 
           CASE WHEN ROW_NUMBER() OVER(
                         PARTITION BY id, category
                         ORDER     BY year, month) = 1
                THEN 1 
                ELSE 0 
           END AS rn1
    FROM base
    ORDER BY id, 
             year_, 
             month_
)
SELECT id,
       category,
       year_,
       month_,
       SUM(rn1) OVER(
            PARTITION BY id
            ORDER     BY year, month 
       ) AS sumC
FROM cte

关于SQL 对分区上的不同计数进行累积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72618684/

相关文章:

c# - SQL Server 中的逗号分隔操作

c# - SQL 查询正在复制行并在我的聚合函数中使用这些行

amazon-web-services - AWS Athena 联合查询在 AWS Batch 中运行时出现权限错误

json - AWS Athena - 查询 JSON - 搜索值

amazon-web-services - 如何删除/删除 AWS athena 中的多个表?

mysql - 带两个变量的Sql累积计数

mysql - 如何根据每个子 channel 的买家数量获取每个主 channel 的买家数量

mysql 计数不能正常工作?

datediff - 雅典娜DateDiff

amazon-s3 - Amazon Athena 相同的查询有时会因 HIVE_CURSOR_ERROR 而失败