#sql #sql-server #ssms
Вопрос:
Вот некоторые поддельные/примерные данные:
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. Я хотел бы, чтобы любой персонид, у которого есть первая строка «NONAME», занимал последнее место, несмотря на рейтинг в файле.
Вот что у меня есть на данный момент. Как вы добиваетесь того, чтобы 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
Комментарии:
1. Это MySQL или SSMS. Какой из них вы используете?
2. @jarlh, это в SSMS
Ответ №1:
Вы почти на месте, вам просто нужно еще одно условие заказа, чтобы ранжировать ваши неименные имена перед 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
Ответ №2:
Попробуйте с:
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
, но чтобы получить желаемый результат, вы должны сделать что-то подобное.