Sql Count()超过()有重复记录
我经常使用sum()over()来计算累积值,但今天我尝试了count()over(),结果出乎我的意料,有人能解释一下为什么结果在同一天有重复记录吗 我知道通常的方法是按日期对组进行计数(不同的I’d),然后对(按日期排序)进行求和(),只是好奇“按日期排序计数(id)”的结果Sql Count()超过()有重复记录,sql,Sql,我经常使用sum()over()来计算累积值,但今天我尝试了count()over(),结果出乎我的意料,有人能解释一下为什么结果在同一天有重复记录吗 我知道通常的方法是按日期对组进行计数(不同的I’d),然后对(按日期排序)进行求和(),只是好奇“按日期排序计数(id)”的结果 结果将是同一天的重复记录。因为外部查询没有过滤或聚合内部查询的结果。它返回相同数量的行 您需要聚合: select pre.date, count(*) as cnt_on_date, sum(count
结果将是同一天的重复记录。因为外部查询没有过滤或聚合内部查询的结果。它返回相同数量的行 您需要聚合:
select pre.date, count(*) as cnt_on_date,
sum(count(*)) over (order by pre.date) as running_count
from (select distinct person_id, date from events) pre
group by pre.date;
除了想到的
行数()
之外,几乎所有的分析函数都不区分order by
子句中相同列值的关系。在一些文档中直接说明:
RANGE
关键字指定逻辑窗口,则函数将为每一行返回相同的结果
ORDER By
,则框架由从分区开始到当前行的所有行组成,加上根据ORDER By
子句等于当前行的任何后续行
ORDER BY
子句,行等于当前行)
但一般来说,在分析子句中添加
ORDER BY
,会隐式地将窗口规范设置为在无界的前一行和当前行之间的范围。当对定义窗口中的每一行进行窗口计算时,将默认设置为范围行,其值与ORDER BY
列相同e进入同一个窗口,并将产生相同的结果。因此,要有一个真正的运行总数,在分析子句的部分的ORDER BY
中应该有行或更多详细列。不支持windowing子句的函数是此规则的例外,但有时它没有直接记录,所以我不会尝试列出可以用作聚合的函数通常也不例外,它们产生相同的值。我明白了!非常感谢:)感谢您的补充:)
select pre.date, count(*) as cnt_on_date,
sum(count(*)) over (order by pre.date) as running_count
from (select distinct person_id, date from events) pre
group by pre.date;