计算表的每个“分区”中的行数

时间:2014-02-25 05:54:01

标签: sql postgresql

免责声明:我并不是指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
  • 的第二个分区

1 个答案:

答案 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;

演示:http://sqlfiddle.com/#!15/b1794/12