有条件的行号

10

我正在尝试根据 RowNum 列的结果进行条件编号。

当 RowNum 为 1 时,我想要有一个全新的增量新列。

输入图像描述

在图中,RoomNum 列中的 5 应该被 2 替换,9 应该被 3 替换,13 应该被 4 替换等等。这个查询中我做错了什么?

SELECT  CASE 
        WHEN rownum < 2
    THEN
    Row_number() OVER (
        PARTITION BY Scheme ORDER BY Scheme ASC
        )  
    ELSE NULL
END AS RoomNum,

CASE 
    WHEN rownum > 1
        THEN NULL
    ELSE scheme
    END AS Scheme
,RowNum

1
你应该使用你正在使用的数据库给你的问题打标签。 - Gordon Linoff
2个回答

21

您需要根据 RoomNm 是否为 NULL 进行分区。 结果值还将具有 CASE

select (case when roomnum is not null
             then row_number() over (partition by scheme, (case when roomnum is not null then 1 else 0 end)
                                     order by roomnum
                                    )
        end) as RoomNum

代码上方的RoomNm应该改为Roomnum。 - Rick Pack
你能帮我理解在“partition by”子句中,“case when”是做什么的吗? - Rick Pack
1
它在其他地方所做的事情也是一样的。其目的是分离空值。 - Gordon Linoff

0
--I think you can work around this way 
--I have little different scenario but hope logic help

declare @ts table
    (WK_DAYS int
    ,DAY_NAME VARCHAR(12)
    ,WORKTYPE   varchar(50)
    ,WK_HOURS   int
    ,workday int)

insert into @ts (WK_DAYS,DAY_NAME,WORKTYPE,WK_HOURS) values (1,'MON','SICK',8)
insert into @ts (WK_DAYS,DAY_NAME,WORKTYPE,WK_HOURS) values (2,'TUE','LABOR',8)
insert into @ts (WK_DAYS,DAY_NAME,WORKTYPE,WK_HOURS) values (3,'WED','LABOR',8)
insert into @ts (WK_DAYS,DAY_NAME,WORKTYPE,WK_HOURS) values (4,'THU','VACATION',8)
insert into @ts (WK_DAYS,DAY_NAME,WORKTYPE,WK_HOURS) values (5,'FRI','LABOR',8)
insert into @ts (WK_DAYS,DAY_NAME,WORKTYPE,WK_HOURS) values (6,'SAT','LABOR',8)
insert into @ts (WK_DAYS,DAY_NAME,WORKTYPE,WK_HOURS) values (7,'SUN','LABOR',8)

SELECT * FROM @TS

SELECT
    X.*
    ,Y.WORKING_DAY
FROM
(SELECT * FROM @ts)X
    LEFT JOIN
(SELECT *,ROW_NUMBER()OVER (ORDER BY WK_DAYS) AS WORKING_DAY FROM @ts WHERE WORKTYPE NOT IN ('SICK','VACATION','SATURDAY','SUNDAY'))Y
ON X.WK_DAYS = Y.WK_DAYS

你能详细解释一下你是如何解决这个问题的,以及原帖作者做错了什么吗? - polka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接