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