dense_rank ()over ID values - 如何按顺序而不是值对 ID 编号进行排名
dense_rank ()over ID values - How to rank ID numbers by order instead of value
我遇到这样一种情况,其中有按结束时间“ts_end_utc”排序的交易,并且每个交易都有一个分配给它的代理。我想在遵循时间顺序的同时为每个代理添加排名(它们在整个交易过程中发生变化)。不幸的是,当我使用 dense_rank 时,它会根据代理 ID 的值进行排名,而不是按照“ts_end_utc”的顺序进行排序。有什么建议吗?
理想情况下,我希望我的排名列“agent_number”以 1 而不是 2 开头,然后在第 8 行切换到 2
dense_rank() over(partition by cte_v3.id_ticket_anchor order by agent) agent_number,
agent_rank
代理
ts_end_utc
id_ticket_anchor
2
200
16:53:28
95300807
2
200
17:01:36
95300807
2
200
17:06:26
95300807
2
200
18:09:58
95300807
2
200
18:17:50
95300807
2
200
18:20:14
95300807
2
200
18:51:52
95300807
3
201
18:53:24
95300807
3
201
19:13:48
95300807
1
199
19:15:47
95300807
期望的结果
agent_rank
代理
ts_end_utc
id_ticket_anchor
1
200
16:53:28
95300807
1
200
17:01:36
95300807
1
200
17:06:26
95300807
1
200
18:09:58
95300807
1
200
18:17:50
95300807
1
200
18:20:14
95300807
1
200
18:51:52
95300807
2
201
18:53:24
95300807
2
201
19:13:48
95300807
3
199
19:15:47
95300807
第二种情况 - 当前结果
agent_rank
代理
ts_end_utc
id_ticket_anchor
1
200
16:53:28
95300807
1
200
17:01:36
95300807
1
200
17:06:26
95300807
1
200
18:09:58
95300807
1
200
18:17:50
95300807
1
200
18:20:14
95300807
1
200
18:51:52
95300807
2
201
18:53:24
95300807
2
201
19:13:48
95300807
3
199
19:15:47
95300807
1
200
19:16:55
95300807
第二种情况 - 期望的结果
agent_rank
代理
ts_end_utc
id_ticket_anchor
1
200
16:53:28
95300807
1
200
17:01:36
95300807
1
200
17:06:26
95300807
1
200
18:09:58
95300807
1
200
18:17:50
95300807
1
200
18:20:14
95300807
1
200
18:51:52
95300807
2
201
18:53:24
95300807
2
201
19:13:48
95300807
3
199
19:15:47
95300807
4
200
19:16:55
95300807
你可以试试这个 -
With cte as
(Select agent,
min(ts_end_utc) as MinEnd
from tableName
group by agent
)
Select
agent,
dense_rank() over(partition by cte.agent order by MinEnd) agent_number
from cte;
根据您的示例输出,我假设您的 ts_end_utc 将始终按顺序排列,并且代理会在一定时间间隔后继续更改。
由于 id_ticket_anchor 中的单个代理有不同的 ts_end_utc 我首先计算了每个 id_ticket_anchor 智能代理的最小值 ts_end_utc min(ts_end_utc)over(partition by id_ticket_anchor, agent)
window 函数。
然后使用dense_rank()
的order by子句。可能有多个具有相同最小值 ts_end_utc 的代理,因此 agent
也按类别顺序使用。
DB-Fiddle:
create table cte_v3(agent int, ts_end_utc time, id_ticket_anchor int);
insert into cte_v3 values(200 ,'16:53:28','95300807');
insert into cte_v3 values(200 ,'17:01:36','95300807');
insert into cte_v3 values(200 ,'17:06:26','95300807');
insert into cte_v3 values(200 ,'18:09:58','95300807');
insert into cte_v3 values(200 ,'18:17:50','95300807');
insert into cte_v3 values(200 ,'18:20:14','95300807');
insert into cte_v3 values(200 ,'18:51:52','95300807');
insert into cte_v3 values(201 ,'18:53:24','95300807');
insert into cte_v3 values(201 ,'19:13:48','95300807');
insert into cte_v3 values(199 ,'19:15:47','95300807');
查询:
With cte as
(
select agent,ts_end_utc,id_ticket_anchor,
min(ts_end_utc)over(partition by id_ticket_anchor, agent) min_ts_end_utc
from cte_v3
)
select dense_rank()over(partition by id_ticket_anchor order by min_ts_end_utc,agent)agent_rank,
agent,ts_end_utc,id_ticket_anchor
from cte
输出:
agent_rank
agent
ts_end_utc
id_ticket_anchor
1
200
16:53:28.0000000
95300807
1
200
17:01:36.0000000
95300807
1
200
17:06:26.0000000
95300807
1
200
18:09:58.0000000
95300807
1
200
18:17:50.0000000
95300807
1
200
18:20:14.0000000
95300807
1
200
18:51:52.0000000
95300807
2
201
18:53:24.0000000
95300807
2
201
19:13:48.0000000
95300807
3
199
19:15:47.0000000
95300807
dbhere
我遇到这样一种情况,其中有按结束时间“ts_end_utc”排序的交易,并且每个交易都有一个分配给它的代理。我想在遵循时间顺序的同时为每个代理添加排名(它们在整个交易过程中发生变化)。不幸的是,当我使用 dense_rank 时,它会根据代理 ID 的值进行排名,而不是按照“ts_end_utc”的顺序进行排序。有什么建议吗?
理想情况下,我希望我的排名列“agent_number”以 1 而不是 2 开头,然后在第 8 行切换到 2
dense_rank() over(partition by cte_v3.id_ticket_anchor order by agent) agent_number,
agent_rank | 代理 | ts_end_utc | id_ticket_anchor |
---|---|---|---|
2 | 200 | 16:53:28 | 95300807 |
2 | 200 | 17:01:36 | 95300807 |
2 | 200 | 17:06:26 | 95300807 |
2 | 200 | 18:09:58 | 95300807 |
2 | 200 | 18:17:50 | 95300807 |
2 | 200 | 18:20:14 | 95300807 |
2 | 200 | 18:51:52 | 95300807 |
3 | 201 | 18:53:24 | 95300807 |
3 | 201 | 19:13:48 | 95300807 |
1 | 199 | 19:15:47 | 95300807 |
期望的结果
agent_rank | 代理 | ts_end_utc | id_ticket_anchor |
---|---|---|---|
1 | 200 | 16:53:28 | 95300807 |
1 | 200 | 17:01:36 | 95300807 |
1 | 200 | 17:06:26 | 95300807 |
1 | 200 | 18:09:58 | 95300807 |
1 | 200 | 18:17:50 | 95300807 |
1 | 200 | 18:20:14 | 95300807 |
1 | 200 | 18:51:52 | 95300807 |
2 | 201 | 18:53:24 | 95300807 |
2 | 201 | 19:13:48 | 95300807 |
3 | 199 | 19:15:47 | 95300807 |
第二种情况 - 当前结果
agent_rank | 代理 | ts_end_utc | id_ticket_anchor |
---|---|---|---|
1 | 200 | 16:53:28 | 95300807 |
1 | 200 | 17:01:36 | 95300807 |
1 | 200 | 17:06:26 | 95300807 |
1 | 200 | 18:09:58 | 95300807 |
1 | 200 | 18:17:50 | 95300807 |
1 | 200 | 18:20:14 | 95300807 |
1 | 200 | 18:51:52 | 95300807 |
2 | 201 | 18:53:24 | 95300807 |
2 | 201 | 19:13:48 | 95300807 |
3 | 199 | 19:15:47 | 95300807 |
1 | 200 | 19:16:55 | 95300807 |
第二种情况 - 期望的结果
agent_rank | 代理 | ts_end_utc | id_ticket_anchor |
---|---|---|---|
1 | 200 | 16:53:28 | 95300807 |
1 | 200 | 17:01:36 | 95300807 |
1 | 200 | 17:06:26 | 95300807 |
1 | 200 | 18:09:58 | 95300807 |
1 | 200 | 18:17:50 | 95300807 |
1 | 200 | 18:20:14 | 95300807 |
1 | 200 | 18:51:52 | 95300807 |
2 | 201 | 18:53:24 | 95300807 |
2 | 201 | 19:13:48 | 95300807 |
3 | 199 | 19:15:47 | 95300807 |
4 | 200 | 19:16:55 | 95300807 |
你可以试试这个 -
With cte as
(Select agent,
min(ts_end_utc) as MinEnd
from tableName
group by agent
)
Select
agent,
dense_rank() over(partition by cte.agent order by MinEnd) agent_number
from cte;
根据您的示例输出,我假设您的 ts_end_utc 将始终按顺序排列,并且代理会在一定时间间隔后继续更改。
由于 id_ticket_anchor 中的单个代理有不同的 ts_end_utc 我首先计算了每个 id_ticket_anchor 智能代理的最小值 ts_end_utc min(ts_end_utc)over(partition by id_ticket_anchor, agent)
window 函数。
然后使用dense_rank()
的order by子句。可能有多个具有相同最小值 ts_end_utc 的代理,因此 agent
也按类别顺序使用。
DB-Fiddle:
create table cte_v3(agent int, ts_end_utc time, id_ticket_anchor int);
insert into cte_v3 values(200 ,'16:53:28','95300807');
insert into cte_v3 values(200 ,'17:01:36','95300807');
insert into cte_v3 values(200 ,'17:06:26','95300807');
insert into cte_v3 values(200 ,'18:09:58','95300807');
insert into cte_v3 values(200 ,'18:17:50','95300807');
insert into cte_v3 values(200 ,'18:20:14','95300807');
insert into cte_v3 values(200 ,'18:51:52','95300807');
insert into cte_v3 values(201 ,'18:53:24','95300807');
insert into cte_v3 values(201 ,'19:13:48','95300807');
insert into cte_v3 values(199 ,'19:15:47','95300807');
查询:
With cte as
(
select agent,ts_end_utc,id_ticket_anchor,
min(ts_end_utc)over(partition by id_ticket_anchor, agent) min_ts_end_utc
from cte_v3
)
select dense_rank()over(partition by id_ticket_anchor order by min_ts_end_utc,agent)agent_rank,
agent,ts_end_utc,id_ticket_anchor
from cte
输出:
agent_rank | agent | ts_end_utc | id_ticket_anchor |
---|---|---|---|
1 | 200 | 16:53:28.0000000 | 95300807 |
1 | 200 | 17:01:36.0000000 | 95300807 |
1 | 200 | 17:06:26.0000000 | 95300807 |
1 | 200 | 18:09:58.0000000 | 95300807 |
1 | 200 | 18:17:50.0000000 | 95300807 |
1 | 200 | 18:20:14.0000000 | 95300807 |
1 | 200 | 18:51:52.0000000 | 95300807 |
2 | 201 | 18:53:24.0000000 | 95300807 |
2 | 201 | 19:13:48.0000000 | 95300807 |
3 | 199 | 19:15:47.0000000 | 95300807 |
db