在Google bigquery中查询不同

时间:2015-11-20 10:01:24

标签: google-bigquery

我有一个包含四列的表格,如下所示:

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)

每个月只有不同。

我该怎么做?

2 个答案:

答案 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)

以下是我试图解决的问题:

  1. 从日期开始提取月份:

    选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月 来自t

  2. 按月分区,因为我们希望从每月开始计算,并从月初开始计算不同的密钥

    选择日期,月份,计数(不同的键)   over(按月份顺序按日期排列无限制的前行和当前行之间的行)cd from (从t)中选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月份

  3. 选择每月的总计数

    选择日期,月份,最大值(cd)cd from( 选择日期,月份,计数(不同的密钥)结束(按月份顺序按日期排列无限制的前一行和当前行之间的行)cd from (从t)中选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月份)) 分组1,2

  4. 对于上一个日期的月初的每个日期计算的唯一键总数:

    选择日期,cd,滞后(cd,1)结束(按日期顺序按日期排序)prev_cd from( 选择日期,月份,最大(cd)cd from( 选择日期,月份,计数(不同的密钥)结束(按月份顺序按日期排列无限制的前一行和当前行之间的行)cd from (从t)中选择键,日期,regexp_extract(日期,r'[\ d] + - (\ d \ d) - \ d \ d')月份)) 分组1,2)

  5. 从当前日期中减去上一个日期 - 这就是答案:

    选择日期,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))