Ранг Фильтра На Основе Столбца, Не Упорядоченного По

#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 , но чтобы получить желаемый результат, вы должны сделать что-то подобное.