根据未排序的列过滤排名
Filter Rank Based On Column Not being Ordered By
这是一些 fake/sample 数据:
DECLARE @tbl1 TABLE (PersonID VARCHAR(255), FirstNM VARCHAR(100), FileNBR VARCHAR(255));
INSERT INTO @tbl1 (PersonID, FirstNM, FileNBR) VALUES
('456789', 'NONAME', 'FileNBR780'),
('456789', 'John', 'FileNBR781'),
('456789', 'NONAME', 'FileNBR783'),
('476362', 'NONAME', 'FileNBR780'),
('476362', 'Mary', 'FileNBR781'),
('476362', 'Mary', 'FileNBR783')
PersonID FirstNM FileNBR
456789 NONAME FileNBR780
456789 John FileNBR781
456789 NONAME FileNBR783
476362 NONAME FileNBR780
476362 Mary FileNBR781
476362 Mary FileNBR783
我正在尝试对 FileNBR 和 PersonID 进行排序。我想让任何 FirstNM 为“NONAME”的 PersonID 排在最后,尽管在 FileNM 中排名。
这是我目前所拥有的。如何做到NONAME不在第一位?
SELECT
PersonID
,FirstNM
,ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY FileNBR ASC) AS RankNBR
FROM @tbl1
产生这些结果:
PersonID FirstNM RankNBR
456789 NONAME 1
456789 John 2
456789 NONAME 3
476362 NONAME 1
476362 Mary 2
476362 Mary 3
但是,这些是想要的结果:
PersonID FirstNM RankNBR
456789 John 1
456789 NONAME 2
456789 NONAME 3
476362 Mary 1
476362 Mary 2
476362 NONAME 3
试试:
select
PersonID,
FirstNM,
row_number() over(
partition by PersonId
order by
case when FirstNm = 'NONAME' then 'ZZZZ' else FirstNM end
) as RankNBR
from @tbl1
您的定义不清楚您是按 FirstNM
还是 FileNBR
排序,但要获得所需的输出,您必须执行类似的操作。
你快完成了,你只需要另一个排序条件来将你的 nonames 排在 RankNBR
之前
SELECT
PersonID
,FirstNM
,ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY case when firstNM='NONAME' then 1 else 0 end,FileNBR ASC) AS RankNBR
FROM @tbl1
这是一些 fake/sample 数据:
DECLARE @tbl1 TABLE (PersonID VARCHAR(255), FirstNM VARCHAR(100), FileNBR VARCHAR(255));
INSERT INTO @tbl1 (PersonID, FirstNM, FileNBR) VALUES
('456789', 'NONAME', 'FileNBR780'),
('456789', 'John', 'FileNBR781'),
('456789', 'NONAME', 'FileNBR783'),
('476362', 'NONAME', 'FileNBR780'),
('476362', 'Mary', 'FileNBR781'),
('476362', 'Mary', 'FileNBR783')
PersonID FirstNM FileNBR
456789 NONAME FileNBR780
456789 John FileNBR781
456789 NONAME FileNBR783
476362 NONAME FileNBR780
476362 Mary FileNBR781
476362 Mary FileNBR783
我正在尝试对 FileNBR 和 PersonID 进行排序。我想让任何 FirstNM 为“NONAME”的 PersonID 排在最后,尽管在 FileNM 中排名。
这是我目前所拥有的。如何做到NONAME不在第一位?
SELECT
PersonID
,FirstNM
,ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY FileNBR ASC) AS RankNBR
FROM @tbl1
产生这些结果:
PersonID FirstNM RankNBR
456789 NONAME 1
456789 John 2
456789 NONAME 3
476362 NONAME 1
476362 Mary 2
476362 Mary 3
但是,这些是想要的结果:
PersonID FirstNM RankNBR
456789 John 1
456789 NONAME 2
456789 NONAME 3
476362 Mary 1
476362 Mary 2
476362 NONAME 3
试试:
select
PersonID,
FirstNM,
row_number() over(
partition by PersonId
order by
case when FirstNm = 'NONAME' then 'ZZZZ' else FirstNM end
) as RankNBR
from @tbl1
您的定义不清楚您是按 FirstNM
还是 FileNBR
排序,但要获得所需的输出,您必须执行类似的操作。
你快完成了,你只需要另一个排序条件来将你的 nonames 排在 RankNBR
SELECT
PersonID
,FirstNM
,ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY case when firstNM='NONAME' then 1 else 0 end,FileNBR ASC) AS RankNBR
FROM @tbl1