gpt4 book ai didi

SQL 按连续行的 session 对行进行排名

转载 作者:行者123 更新时间:2023-11-29 11:42:21 24 4
gpt4 key购买 nike

我有一张 table :

 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');

我需要以这种方式对这个表中的行进行排名,每个 session 的行都将具有相同的排名。 session 是一系列具有相同 emp_id 和 telecom_id 的连续行。

例如,第 1-3 行构成一个 session ,因为所有 3 行的 emp_id = 1telecom_id = 1。第 4 行形成另一个 session 。第 5-6 行形成第 3 个 session 等。

用于对数据存储在表中的顺序进行排序是至关重要的。

期望的输出:

 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 窗口函数获取 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

Results :

| 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 |

关于SQL 按连续行的 session 对行进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53098951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com