我有一个包含四列的表格,如下所示:
id,name, key, date
1,'A' ,'x1','2015-11-11'
2,'A' ,'x1','2015-11-11'
3,'B' ,'x2','2015-11-11'
4,'B' ,'x2','2015-11-11'
5,'A' ,'x1','2015-11-12'
6,'A' ,'x1','2015-11-12'
7,'B' ,'x2','2015-11-12'
8,'B' ,'x2','2015-11-12'
9,'D' ,'x3','2015-11-12'
10,'A' ,'x1','2015-12-11'
11,'A' ,'x1','2015-12-11'
12,'B' ,'x2','2015-12-11'
13,'B' ,'x2','2015-12-11'
14,'A' ,'x1','2015-12-12'
15,'A' ,'x1','2015-12-12'
16,'B' ,'x2','2015-12-12'
17,'B' ,'x2','2015-12-12'
18,'D' ,'x3','2015-12-12'
我想计算每个key
的不同新 date
- s的数量:
2015-11-11 2 -- (two distinct keys: x1 and x2)
2015-11-12 1 -- (one new key: x3)
2015-12-11 2 -- (two distinct keys: x1 and x2) - (different month 11)
2015-12-12 1 -- (one new key: x3) - (different month 11)
每个月只有不同。
我该怎么做?
答案 0 :(得分:1)
它与您之前的问题完全一样 - 您只需要按月添加额外的组/分区 - >请参阅使用YearMonth字段
SELECT DATE, EXACT_COUNT_DISTINCT(key) AS keys
FROM (
SELECT DATE, key, LEAD(DATE) OVER(PARTITION BY key, YearMonth ORDER BY DATE DESC) AS new
FROM (SELECT DATE, LEFT(DATE, 7) AS YearMonth, key FROM YourTable GROUP BY 1, 2, 3)
) WHERE new IS NULL
GROUP BY DATE
ORDER BY DATE
答案 1 :(得分:0)
以下是我试图解决的问题:
从日期开始提取月份:
选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月 来自t
按月分区,因为我们希望从每月开始计算,并从月初开始计算不同的密钥
选择日期,月份,计数(不同的键) over(按月份顺序按日期排列无限制的前行和当前行之间的行)cd from (从t)中选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月份
选择每月的总计数
选择日期,月份,最大值(cd)cd from( 选择日期,月份,计数(不同的密钥)结束(按月份顺序按日期排列无限制的前一行和当前行之间的行)cd from (从t)中选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月份)) 分组1,2
对于上一个日期的月初的每个日期计算的唯一键总数:
选择日期,cd,滞后(cd,1)结束(按日期顺序按日期排序)prev_cd from( 选择日期,月份,最大(cd)cd from( 选择日期,月份,计数(不同的密钥)结束(按月份顺序按日期排列无限制的前一行和当前行之间的行)cd from (从t)中选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月份)) 分组1,2)
从当前日期中减去上一个日期 - 这就是答案:
选择日期,cd - prev_cd from( 选择日期,cd,滞后(cd,1)结束(按日期分区按日期排序)prev_cd from( 选择日期,月份,最大(cd)cd from( 选择日期,月份,计数(不同的密钥)结束(按月份顺序按日期排列无限制的前一行和当前行之间的行)cd from (从moshap.wd中选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月)) 分组1,2))