首页 > 解决方案 > t-sql 在组内重复行号

问题描述

每次任务历史记录中的名称更改时,我都需要创建一个 ID。rank 需要对每个task 和 step重新启动。

我最接近目标的是使用下面的代码。

但是当一个人再次出现在历史动作列表中时,它不会产生正确的结果。

DENSE_RANK() OVER (ORDER BY TaskName, Person) 

提前致谢

在此处输入图像描述

标签: sqlsql-serverdense-rank

解决方案


您可以使用lag()来查看一个人的变化。然后使用累积和:

select t.*,
       sum(case when prev_person = person then 0 else 1 end) over
           (partition by task_name order by timestamp) as desired_output
from (select t.*,
             lag(person) over (partition by task_name order by timestamp) as prev_person
      from t
     ) t ;

注意:我将您的问题解释为您希望为每个任务分别提供数字(“每次任务历史记录中的名称更改”)。

编辑:

根据您的评论:

select t.*,
       sum(case when prev_person = person and prev_stop_name = step_name then 0 else 1 end) over
           (partition by task_name order by timestamp) as desired_output
from (select t.*,
             lag(person) over (partition by task_name order by timestamp) as prev_person,
             lag(step_name) over (partition by task_name order by timestamp) as prev_step_name
      from t
     ) t ;

推荐阅读