SQL Server - 有没有办法根据特定值启动 row_number(),如果没有值则以另一种方式启动?

问题描述 投票:0回答:1

我一直在尝试寻找以下情况的解决方案,但即使我尝试了不同的方法,我仍然无法得到想要的结果。

我有下表,里面有员工处理的文档信息,你可以看到不同的员工可以全天处理同一个文档。 我需要获取员工开始处理文档的开始日期/时间,但问题是有时他们不会开始处理文档,直到他们在系统上单击开始,即 process_type 获得值 1,但是当其他员工没有处理文档时,我还需要这些信息(在 process_type 上没有价值)。

主桌

期望的结果将如本表所示(行 = 1 是事件的开始)

想要的结果

我尝试过使用 row_number,而不是 partition_by,甚至使用 WHERE 子句或 CASE WHEN,但是当名称更改为另一名员工时,它会一直给出 row = 1 ...

sql sql-server row-number
1个回答
-1
投票

用于描述计数器重置的标准间隙和孤岛方法(通过行号差异)。假设(最多)只有一行的过程类型为 1,在第二步中我们只需要获取特定的行号来计算和它后面的行的相对偏移量。调整后的输出行号然后从这些值派生:

with grouped as (
    select *,
        row_number() over (
            partition by document_id
            order by
                last_modification,
                case when process_type is null then 0 else 1 end) as rn0,
        row_number() over (
            partition by document_id, employee
            order by
                last_modification,
                case when process_type is null then 0 else 1 end) as rn
    from T
), tagged as (
    select *,
        min(case when process_type = 1 then rn end) over (
            partition by document_id, employee, rn0 - rn) as ofs
    from grouped
)
select *,
    case when rn < ofs or ofs is null then 0
         else rn - ofs + 1 end as "row"
from tagged
order by document_id, employee, rn;

对我来说很好用:https://dbfiddle.uk/EQtA1-Nx

© www.soinside.com 2019 - 2024. All rights reserved.