Ограничить ROW_NUMBER порядком неповторяющихся значений - PullRequest
0 голосов
/ 30 января 2019

Как я могу ранжировать свои данные, устанавливая разные значения для каждой строки, но давая первые значения ранга отдельным строкам?

У меня есть данные электронных писем, и я ДОЛЖЕН БЫТЬ ЗАПИСАН на электронную почту, поскольку она действительнаили нет.Я уже выполнил часть проверки, однако у меня много проблем с процессом ранжирования.

Этот пример данных для одного человека.

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

WANTED:

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 Ответ

0 голосов
/ 30 января 2019

Ну, вы можете перечислить электронные письма, а затем использовать их в 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 ;
...