t-sql 组内重复行号
t-sql repeat row numbers within group
我需要为任务历史记录中的每次名称更改创建一个 ID。
排名需要重新启动 每个 任务和步骤 。
最接近我的目标的是使用下面的代码。
但是当一个人再次出现在历史动作列表中时,它不会产生正确的结果。
DENSE_RANK() OVER (ORDER BY TaskName, Person)
提前致谢
您可以使用 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 ;
我需要为任务历史记录中的每次名称更改创建一个 ID。 排名需要重新启动 每个 任务和步骤 。
最接近我的目标的是使用下面的代码。
但是当一个人再次出现在历史动作列表中时,它不会产生正确的结果。
DENSE_RANK() OVER (ORDER BY TaskName, Person)
提前致谢
您可以使用 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 ;