【问题标题】:Restrict ROW_NUMBER to order non-repeated values限制 ROW_NUMBER 对非重复值进行排序
【发布时间】:2019-06-24 04:52:52
【问题描述】:

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

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

这个数据示例是针对一个人的。

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

【问题讨论】:

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


    【解决方案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 ;
    

    【讨论】:

    • 我必须阅读更多内容才能了解此功能的原理,但对于 2 个示例来说,它工作正常。非常感谢您的快速回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2011-12-28
    • 1970-01-01
    • 2012-02-28
    • 2012-01-17
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多