如何按范围分组,或有条件地从查询结果中选择

Posted

技术标签:

【中文标题】如何按范围分组,或有条件地从查询结果中选择【英文标题】:how do I Group by range, or conditionally select from query results 【发布时间】:2021-07-08 20:46:06 【问题描述】:

我有一个用户活动表,我正在尝试获取过去 28 天中每天所有不同用户的计数。例如,7/7 的不同计数为 7/7 和 6/9,而 7/6 的不同计数为 7/6 到 6/8

我不能只获取每天不同的用户并将它们相加,因为在整个范围内,不同的用户数会重复计算。仅此数字 1 天很容易,但我每天都需要它来收集数据

【问题讨论】:

请提供样本数据和期望的结果。 【参考方案1】:

uniqStates 可以求和

create table u (date Date, uid Int64) Engine=Memory;
insert into u select toDate('2021-01-01') + number, arrayJoin( range(number,  number*2+5 ) ) from numbers(31);

select x.1 date, uniqMerge(x.2) uniq_per_date, uniqMerge(arrayJoin(y)) uniq_from_beginning from (select groupArray( (date, s) ) xx, arrayMap( i-> arraySlice(xx.2, 1, i), range(length(xx))) yy from (select date, uniqState(uid) s from u group by date order by date)) array join xx as x, yy as y group by date ;

┌───────date─┬─uniq_per_date─┬─uniq_from_beginning─┐
│ 2021-01-02 │             6 │                   5 │
│ 2021-01-03 │             7 │                   7 │
│ 2021-01-04 │             8 │                   9 │
│ 2021-01-05 │             9 │                  11 │
│ 2021-01-06 │            10 │                  13 │
│ 2021-01-07 │            11 │                  15 │
│ 2021-01-08 │            12 │                  17 │
│ 2021-01-09 │            13 │                  19 │
│ 2021-01-10 │            14 │                  21 │
│ 2021-01-11 │            15 │                  23 │
│ 2021-01-12 │            16 │                  25 │

【讨论】:

以上是关于如何按范围分组,或有条件地从查询结果中选择的主要内容,如果未能解决你的问题,请参考以下文章

当必须根据条件对记录进行分组时如何选择最多 x 行

在嵌套选择查询中按条件分组后加入

请求有关如何在一个查询中对多个条件的计数进行分组的帮助

SQL递归查询知多少

如何在单个 SQL 查询中使用多个计数和按条件分组

Oracle - 按类别分组,日期范围[重复]