免责声明:我并不是指window function意义上的分区,也不是table partitioning;我的意思是它在more general sense,即分开。
这是一张表:
id | y
----+------------
1 | 1
2 | 1
3 | 1
4 | 2
5 | 2
6 | null
7 | 2
8 | 2
9 | null
10 | null
我想通过检查y
上的相等性来进行分区,这样我最终会得到y
的每个值连续出现的次数的计数,在id
上排序时(即按所示顺序)。
这是我正在寻找的输出:
y | count
-----+----------
1 | 3
2 | 2
null | 1
2 | 2
null | 2
因此,读取该输出中的行,我们有:
1
的第一个分区2
的第一个分区null
2
的第二个分区null
s 答案 0 :(得分:2)
尝试:
SELECT y, count(*)
FROM (
SELECT y,
sum( xyz ) OVER (
ORDER BY id
rows between unbounded preceding
and current row
) qwe
FROM (
SELECT *,
case
when y is null and
lag(y) OVER ( ORDER BY id ) is null
then 0
when y = lag(y) OVER ( ORDER BY id )
then 0
else 1 end xyz
FROM table1
) alias
) alias
GROUP BY qwe, y
ORDER BY qwe;