[英]order by changing count () over (partition by ) result set
[英]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.