我正在使用 AWS Athena(基于 Presto),并且该表名为 base
:
我想制作一个查询,计算每个 id 的类别的不同值,每月和每年累计,但保留原始列:
我尝试执行以下查询但没有成功:
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/