条件行号
Conditional RowNumber
我正在尝试根据 RowNum 列的结果进行条件编号。
当 RowNum 为 1 时,我希望新列的全新增量为 1。
图片中RoomNum 5列应该换成2,9换成3m 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
您需要根据 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
--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
我正在尝试根据 RowNum 列的结果进行条件编号。
当 RowNum 为 1 时,我希望新列的全新增量为 1。
图片中RoomNum 5列应该换成2,9换成3m 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
您需要根据 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
--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