Ограничить ROW_NUMBER порядком неповторяющихся значений
Как я могу ранжировать свои данные, устанавливая разные значения для каждой строки, но давая первые значения ранга отдельным строкам?
У меня есть данные электронных писем, и я ДОЛЖЕН БЫТЬ РАЗРЕШЕН на электронную почту, поскольку она действительна или нет Я уже сделал часть проверки, однако у меня много проблем с процессом ранжирования.
Этот пример данных для одного человека.
ID | EMAIL |
181818 | example@mail.com |
181818 | exam@pe@mail.com |
181818 | example@mail.com |
181818 | |
181818 | example1@mail.com |
181818 | examlpe@mail.com |
181818 | |
Итак, моя проверка дает мне что-то вроде этого
ID | EMAIL | VALID
181818 | example@mail.com | 1
181818 | exam@pe@mail.com | 0
181818 | example@mail.com | 1
181818 | | 0
181818 | example1@mail.com | 1
181818 | examlpe@mail.com | 1
181818 | | 0
Мой код для ранжирования этих данных:
SELECT E.ID,
UPPER(E.EMAIL),
ROW_NUMBER()
OVER ( PARTITION BY E.ID
ORDER BY ( CASE
--VALIDATION PROCESS
END) DESC) AS ROWNO
FROM TABLE E
WHERE E.ID = 181818 ;
Этот запрос сначала возвращает действительные письма и последнее недействительное, что я и хочу, однако я не хочу, чтобы повторные данные появлялись сверху. Я хотел бы что-то вроде DENSE_RANK
но повторные данные должны быть в конце, чтобы избежать равных значений ранжирования.
ВЕРНУТЬ:
ID | EMAIL | ROWNO
181818 | example@mail.com | 1
181818 | example@mail.com | 2
181818 | example1@mail.com | 3
181818 | examlpe@mail.com | 4
181818 | exam@pe@mail.com | 5
181818 | | 6
181818 | | 7
В РОЗЫСКЕ:
ID | EMAIL | ROWNO
181818 | example@mail.com | 1
181818 | example1@mail.com | 2
181818 | examlpe@mail.com | 3
181818 | example@mail.com | 4
181818 | exam@pe@mail.com | 5
181818 | | 6
181818 | | 7
1 ответ
Ну, вы можете перечислить электронные письма, а затем использовать это в ORDER BY
, Это поместит электронные письма в группы, причем все значения будут отображаться ровно один раз перед дублированием.
SELECT E.ID, UPPER(E.EMAIL),
ROW_NUMBER() OVER (PARTITION BY E.ID
ORDER BY is_valid DESC, seqnum
) AS rownumber
FROM (SELECT E.*,
(CASE --VALIDATION PROCESS THEN 1 ELSE 0 END) a is_valid,
ROW_NUMBER() OVER (PARTITION BY e.ID, UPPER(e.EMAIL) ORDER BY e.id) as seqnum
FROM TABLE E
) E
WHERE E.ID = 181818 ;