postgres如何仅在值更改时增加计数器

postgres how to increment counter only if value changes

我有一个 table,其中包含按时间和地点排序的动物位置。当位置从一个 ID 更改为下一个 ID 时,我想增加一个计数器。所以每个 "Stay" 的动物都应该得到一个唯一的 ID(计数器)。我有一个非SQL的描述:

counter = 0
CASE (location at ID = location at ID-1) SET counter+1

我尝试使用 Dense_Rank() 但未能正确设置分区。这是一个带有所需计数器的示例。

ID Location Counter
1    3          1
2    3          1
3    2          2
4    2          2
5    3          3 
6    1          4 
7    3          5 
8    3          5 
9    3          5

CREATE TABLE locations (idn serial PRIMARY KEY, location integer);
INSERT INTO locations (location ) VALUES (3);
INSERT INTO locations (location ) VALUES (3);
INSERT INTO locations (location ) VALUES (2);
INSERT INTO locations (location ) VALUES (2);
INSERT INTO locations (location ) VALUES (3);
INSERT INTO locations (location ) VALUES (1);
INSERT INTO locations (location ) VALUES (3);
INSERT INTO locations (location ) VALUES (3);
INSERT INTO locations (location ) VALUES (3);

你可以试试延迟功能。

这是一个适用于 Big SQL 的示例:

select id, location,
    sum(case when previousVal = location then 0 else 1 end) over(order by id) as Counter
from (
    select Id, location, lag(location, 1) over(order by Id) as previousVal
    from temp.locations
) tbl
order by Id;

输出:

ID LOCATION COUNTER1
1       3       1
2       3       1
3       2       2
4       2       2
5       3       3
6       1       4
7       3       5
8       3       5
9       3       5