限制ROW_NUMBER以订购非重复值

时间:2019-01-30 19:54:25

标签: sql oracle rank row-number dense-rank

如何对设置不同值的数据进行排名,但是将排名的第一个值赋予不同的行?

我有电子邮件数据,因此我必须对电子邮件进行排名,因为它是否有效。我已经完成了验证部分,但是在排名过程中遇到了很多麻烦。

此数据示例仅适用于一个人。

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的内容,但重复的数据必须以a结尾,以避免排名值相等。

返回:

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 个答案:

答案 0 :(得分: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 ;