Ограничить 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 ;
Другие вопросы по тегам