繁体   English   中英

带有 PARTITION 的 COUNT() 生成不一致的结果

[英]COUNT() with PARTITION generates inconsistent result

请考虑以下 T-SQL 语句。

    SELECT 
           [isin],
           v_year,
           growth_start,
           COUNT(v_year)     OVER (PARTITION BY isin) as n_count,
           MAX(growth_start) OVER (PARTITION BY isin) as max_growth_start
      FROM valuation_basic
     WHERE isin = 'CH0012221716'
  GROUP BY isin, v_year, growth_start
  ORDER BY v_year

  SELECT count(v_year)     FROM valuation_basic WHERE isin = 'CH0012221716'
  SELECT max(growth_start) FROM valuation_basic WHERE isin = 'CH0012221716'

在此处输入图像描述

我期望n_count列具有与SELECT count(v_year) FROM valuation_basic WHERE isin = 'CH0012221716'相同的值。 但是,它们的值显着不同(336 对 245)。

为什么是这样? 我认为语句COUNT(v_year) OVER (PARTITION BY isin) as n_count将通过唯一标识符isin列给出行数。

这个表达式:

COUNT(v_year) OVER (PARTITION BY isin) as n_count,

发生聚合之后。 因此,它正在计算结果集中的行数。 这与每个组中汇总的原始行数无关。

相反,您想要每行中计数的SUM() ,因此您想要:

SUM(COUNT(v_year)) OVER (PARTITION BY isin) as n_count,

COUNT()是聚合 function。 它正在计算每个组中汇总的原始行。 SUM() OVER是 window function。 然后将计数相加 - 这是总计数。

这是一个简单的例子:

x    
a 
a
a
b

这个查询:

select x, count(*)
from t
group by x;

回报:

a      3
b      1   

请注意这会返回什么:

select x, count(*),
       count(*) over (),
       sum(count(*)) over (),
       max(count(*)) over ()
from t
group by x;

结果是:

a      3      2      4      3
b      1      2      4      3

2是因为结果集中有两行。 4是因为3 + 1 = 4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM