我有一个串行的sql,比如:
select count(distinct userId) from table where hour >= 0 and hour <= 0;
select count(distinct userId) from table where hour >= 0 and hour <= 1;
select count(distinct userId) from table where hour >= 0 and hour <= 2;
...
select count(distinct userId) from table where hour >= 0 and hour <= 14;
有没有办法将它们合并到一个sql中?
1条答案
按热度按时间cigdeys31#
看起来你在试图保持一个以小时为单位的累积计数。为此,可以使用窗口函数,如下所示:
可能有一种更简单的方法,但这通常会得到正确的答案。
说明:
这对相同的输入使用2个子查询
table
,具有名为include
跟踪哪些记录应贡献给每个存储桶的最终总数。第一个子查询简单地获取表中的所有记录并赋值0 AS include
. 第二个子查询找到所有唯一的name
s和最低hour
在哪个槽里name
出现,并将其指定给1 AS include
. 这两个子查询是LEFT JOIN
'由封闭查询分隔。最外层的查询执行
COALESCE(M.include, 0)
填写任何NULL
是由LEFT JOIN
,还有那些1
的和0
是的SUM
“一个又一个hour
. 这需要一个SELECT DISTINCT
而不是使用GROUP BY
因为GROUP BY
两者都要hour
以及include
列出,但它最终会折叠给定hour
分组成一行(仍使用include=1
). 这个DISTINCT
在SUM
因此它将删除重复项而不丢弃任何输入行。