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
我有一个 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