SQL按连续行的会话对行进行排序
我有一张桌子:SQL按连续行的会话对行进行排序,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我有一张桌子: id | emp_id | telecom_id | ----+------------+------------------+ 1 | 1 | 1 | 2 | 1 | 1 | 3 | 1 | 1 | 4 | 1 | 2 | 5 | 1
id | emp_id | telecom_id |
----+------------+------------------+
1 | 1 | 1 |
2 | 1 | 1 |
3 | 1 | 1 |
4 | 1 | 2 |
5 | 1 | 3 |
6 | 1 | 3 |
7 | 1 | 1 |
8 | 2 | 5 |
9 | 2 | 1 |
10 | 1 | 1 |
11 | 2 | 1 |
12 | 2 | 1 |
为方便起见,以下是创建和填充表格的命令:
CREATE TABLE table1 (
id int NOT NULL,
emp_id varchar(255),
telecom_id varchar(255)
);
insert into table1 (id, emp_id, telecom_id) values(1, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(2, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(3, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(4, '1', '2');
insert into table1 (id, emp_id, telecom_id) values(5, '1', '3');
insert into table1 (id, emp_id, telecom_id) values(6, '1', '3');
insert into table1 (id, emp_id, telecom_id) values(7, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(8, '2', '5');
insert into table1 (id, emp_id, telecom_id) values(9, '2', '1');
insert into table1 (id, emp_id, telecom_id) values(10, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(11, '2', '1');
insert into table1 (id, emp_id, telecom_id) values(12, '2', '1');
我需要对这个表中的行进行排序,每个会话的行都有相同的排序。会话是一系列具有相同emp_id和电信id的连续行
例如,行1-3形成一个会话,因为所有3行的emp\u id=1
和telecom\u id=1
。第4行形成另一个会话。第5-6行形成第三节等
在对数据存储在表中的顺序进行排序时使用它是至关重要的
期望输出:
id | emp_id | telecom_id | rnk
----+------------+------------------+------
1 | 1 | 1 | 1
2 | 1 | 1 | 1
3 | 1 | 1 | 1
4 | 1 | 2 | 2
5 | 1 | 3 | 3
6 | 1 | 3 | 3
7 | 1 | 1 | 4
8 | 2 | 5 | 5
9 | 2 | 1 | 6
10 | 1 | 1 | 7
11 | 2 | 1 | 8
12 | 2 | 1 | 8
我尝试了各种窗口函数选项,但没有一个能达到预期效果。
下面是一次尝试,它产生了与我尝试实现的目标最接近的结果:
select emp_id, telecom_id, rank()
over(partition by emp_id, telecom_id order by id) as rnk
from table1;
我正在使用PostgreSQL。您可以尝试使用
lag
窗口函数get pre Val,并使用条件聚合函数SUM
和窗口函数来生成逻辑
CREATE TABLE table1 (
id int NOT NULL,
emp_id varchar(255),
telecom_id varchar(255)
);
insert into table1 (id, emp_id, telecom_id) values(1, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(2, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(3, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(4, '1', '2');
insert into table1 (id, emp_id, telecom_id) values(5, '1', '3');
insert into table1 (id, emp_id, telecom_id) values(6, '1', '3');
insert into table1 (id, emp_id, telecom_id) values(7, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(8, '2', '5');
insert into table1 (id, emp_id, telecom_id) values(9, '2', '1');
insert into table1 (id, emp_id, telecom_id) values(10, '1', '1');
insert into table1 (id, emp_id, telecom_id) values(11, '2', '1');
insert into table1 (id, emp_id, telecom_id) values(12, '2', '1');
查询1:
SELECT id,emp_id,telecom_id,
SUM(CASE WHEN
pretelecomVal = telecom_id
and pre_emp_idVal = emp_id
then 0 else 1 end) over(order by id) rnk
FROM (
select *,
lag(telecom_id) over(partition by emp_id order by id) pretelecomVal,
lag(emp_id) over(order by id) pre_emp_idVal
from table1
) t1
| id | emp_id | telecom_id | rnk |
|----|--------|------------|-----|
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 1 |
| 3 | 1 | 1 | 1 |
| 4 | 1 | 2 | 2 |
| 5 | 1 | 3 | 3 |
| 6 | 1 | 3 | 3 |
| 7 | 1 | 1 | 4 |
| 8 | 2 | 5 | 5 |
| 9 | 2 | 1 | 6 |
| 10 | 1 | 1 | 7 |
| 11 | 2 | 1 | 8 |
| 12 | 2 | 1 | 8 |
:
SELECT id,emp_id,telecom_id,
SUM(CASE WHEN
pretelecomVal = telecom_id
and pre_emp_idVal = emp_id
then 0 else 1 end) over(order by id) rnk
FROM (
select *,
lag(telecom_id) over(partition by emp_id order by id) pretelecomVal,
lag(emp_id) over(order by id) pre_emp_idVal
from table1
) t1
| id | emp_id | telecom_id | rnk |
|----|--------|------------|-----|
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 1 |
| 3 | 1 | 1 | 1 |
| 4 | 1 | 2 | 2 |
| 5 | 1 | 3 | 3 |
| 6 | 1 | 3 | 3 |
| 7 | 1 | 1 | 4 |
| 8 | 2 | 5 | 5 |
| 9 | 2 | 1 | 6 |
| 10 | 1 | 1 | 7 |
| 11 | 2 | 1 | 8 |
| 12 | 2 | 1 | 8 |
使用密集_秩而不是rank@AjanBalakumaran,RANK()和DENSE_RANK()都会产生不同于我想要实现的结果。您使用的是哪种dbms?能否为您的数据集提供一个fiddle或声明的表,这样人们就可以轻松地为其工作you@AjanBalakumaran,更新了我的问题,为表格添加了命令creation@DmitriyFialkovskiy没问题,我很乐意帮忙