具有不同时间跨度的日期分组

hof1towb  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(301)

目前,我正在努力实现某种重叠的聚合。
我的表的当前结构是:

|ymd     |id|costs|
|--------|--|-----|
|20200101|a |10   |
|20200102|a |12   |
|20200101|b |13   |
|20200101|c |15   |
|20200102|c |1    |

不过,我想分组的方式,我有不同的时间跨度每个项目。考虑到我正在20200103上运行此查询,我尝试实现的结果是:

| timespan   | id | costs |
|------------|----|-------|
| last 2 days| a  |  22   |
| last 1 day | a  |  12   |
| last 2 days| b  |  13   |
| last 1 day | b  |  0    |
| last 2 days| c  |  16   |
| last 1 day | c  |  1    |

我尝试过很多事情,但到目前为止我还没有达到我所需要的。这是我尝试过的查询,没有正确的结果:

SELECT 
    CASE 
        WHEN ymd BETWEEN date_add(current_date(),-2) AND to_date(current_date()) THEN '2 days' 
        WHEN ymd BETWEEN date_add(current_date(),-1) AND to_date(current_date()) THEN '1 day'
    END AS timespan,
    id,
    sum(costs) AS costs
FROM `table`
GROUP BY
    CASE 
        WHEN ymd BETWEEN date_add(current_date(),-2) AND to_date(current_date()) THEN '2 days' 
        WHEN ymd BETWEEN date_add(current_date(),-1) AND to_date(current_date()) THEN '1 day'
    END,
    id
myss37ts

myss37ts1#

您可以构建一个存储时间戳的派生表,将其与不同的用户列表交叉连接以生成所有可能的组合,然后将表与 left join 和骨料:

select d.timespan, i.id, coalesce(sum(t.costs), 0) costs
from (select distinct id from mytable) i
cross join (
    select 1 n, 'last 1 day' timespan
    union all select 2, 'last 2 day'
) d 
left join mytable t
    on t.ymd between date_add(current_date(), - d.n) and current_date()
group by d.n, d.timespan, i.id

相关问题