如何获得零钱?

How to get the change number?

source值改变时如何增加值?
我试过 rank, dense_rank, row_number 都没有成功 =(

id | src | how to get this?
--------
1  |  1  | 1
2  |  1  | 1
3  |  7  | 2
4  |  1  | 3
5  |  3  | 4
6  |  3  | 4
7  |  1  | 5

注意:src保证按照您看到的顺序

有没有简单的方法可以做到这一点?

您可以通过嵌套两个 window 函数来实现此目的 - 第一个获取 src 值是否从上一行更改,第二个计算更改的次数。不幸的是,Postgres 不允许直接嵌套 window 函数,但是 you can work around that 带有子查询:

SELECT
  id,
  src,
  sum(incr) OVER (ORDER BY id)
FROM (
  SELECT
    *,
    (lag(src) OVER (ORDER BY id) IS DISTINCT FROM src)::int AS incr
  FROM example
) AS _;

(online demo)