【问题标题】:Count distinct in a date range, running grass_date在日期范围内计数不同,运行 Grass_date
【发布时间】:2021-07-02 10:17:36
【问题描述】:

我有一张这样的桌子:

date name
1/1 a
1/2 b
1/3 c
1/2 a
1/3 d

并且需要从每行的日期开始计算 7 天内可用的不同名称。 结果应该是:

date count explain
1/1 1 a
1/2 2 a,b
1/3 4 a,b,c,d

我试过这些 count+if、count+case when、lag 函数:

  • COUNT(DISTINCT(IF(date_1 between date - INTERVAL '7' DAY and date, name)))
  • lag(count(distinct name), 7) over (order by date)

没有任何作用,结果只是每天计算的名字。

请指教,非常感谢!

【问题讨论】:

  • 请标记您正在使用的数据库。
  • 添加了 presto,非常感谢

标签: sql presto


【解决方案1】:

嗯。 . .这符合您的要求吗?

select min_date, 
       sum(count(*)) over (order by date) as cnt,
       array_agg(array_agg(name)) over (order by date) as names
from (select name, min(date) as min_date
      from t
      group by name
     ) t
group by min_date;

编辑:

假设每个日期有一行,添加一个窗框规范:

select min_date, 
       sum(count(*)) over (order by date rows between 6 preceding and current row) as cnt,
       array_agg(array_agg(name)) over (order by date rows between 6 preceding and current row) as names
from (select name, min(date) as min_date
      from t
      group by name
     ) t
group by min_date

【讨论】:

  • 好一个,但我还需要另外 1 个条件,即只计算记录行中日期前 7 天内的姓名
  • 问候戈登。使用 min(date) 将导致仅在第一天记录中计算名称,而我仍然需要在该名称出现的每个日期中计算不同的名称。尝试删除 min() 但 Presto 为我的 50M+ 行 DB 计算的时间太长。我可能会尝试切换到 python 来计算这个。非常感谢!
  • 哦,又一次尝试,根据您的帮助得到了我需要的东西。拯救了我的一天。赞美戈登! select date, cardinality(names) from (select txn_date, array_distinct(flatten(array_agg(array_agg(distinct name)) over (order by date rows between 29 preceding and current row))) as names from (select distinct date, name from t) group by 1)
  • @itsmethubui 如果答案适合您 - 请将其标记为已接受(左侧勾勒出复选标记)。
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多