【问题标题】:Count()over() have repeated recordscount()over() 有重复记录
【发布时间】:2020-11-12 14:16:24
【问题描述】:

我经常使用sum() over()来计算累计值,但是今天,我尝试了count()over(),结果出乎我的意料,谁能解释一下为什么同一天的结果有重复记录?

我知道常规的方法是count(distinct I'd) group by date,然后sum()over(order by date),只是好奇"count(id)over(order by date)的结果"

Select pre.date,count(person_id) over (order by pre.date)
From (select distinct person_id, date from events) pre

结果将在同一天重复记录。

【问题讨论】:

    标签: sql


    【解决方案1】:

    因为您的外部查询没有过滤或聚合内部查询的结果。它返回相同的行数。

    你想要聚合:

    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;
    

    【讨论】:

    • 我明白了!非常感谢:)
    【解决方案2】:

    除了想到的row_number() 之外,几乎所有的分析函数都不区分order by 子句中相同列值的关系。在一些文档中直接说明:

    如果您使用 RANGE 关键字指定逻辑窗口,则该函数为每一行返回相同的结果

    默认情况下,如果提供ORDER BY,则该帧由从分区开始到当前行的所有行组成,加上根据@987654328等于当前行的任何后续行@ 子句

    使用'ORDER BY':默认帧包括从分区开始到当前行的行,包括当前行的所有对等点(根据ORDER BY子句,行等于当前行) em>。

    但一般来说,在分析子句中添加ORDER BY 会隐式地将窗口规范设置为RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。由于对定义窗口中的每一行进行窗口计算,默认为RANGE 行与ORDER BY 列的相同值将进入同一个窗口并产生相同的结果。所以要得到一个真正的运行总数,应该有ROWS BETWEEN 或更详细的列在ORDER BY 分析子句的一部分。不支持windowing 子句的函数是这个规则的例外,但它有时没有直接记录,所以我不会在这里列出它们。可以用作聚合的函数一般也不例外,并且产生相同的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-02
      • 2022-11-13
      • 2021-12-15
      • 2016-01-14
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多