限制 ROW_NUMBER 对非重复值进行排序
Restrict ROW_NUMBER to order non-repeated values
如何对我的数据进行排名,为每行设置不同的值,但将排名的第一个值提供给不同的行?
我有电子邮件数据,我必须根据电子邮件是否有效对电子邮件进行排名。我已经完成了验证部分,但是我在排名过程中遇到了很多麻烦。
这个数据示例是一个人的。
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 ;
这个查询 returns 有效邮件在前,无效邮件在后,这是我想要的,但是我不希望重复的数据出现在顶部。我想要 DENSE_RANK
之类的东西,但重复的数据放在最后,以避免排名值相等。
RETURN:
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
好吧,您可以枚举电子邮件,然后在 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 ;
如何对我的数据进行排名,为每行设置不同的值,但将排名的第一个值提供给不同的行?
我有电子邮件数据,我必须根据电子邮件是否有效对电子邮件进行排名。我已经完成了验证部分,但是我在排名过程中遇到了很多麻烦。
这个数据示例是一个人的。
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 ;
这个查询 returns 有效邮件在前,无效邮件在后,这是我想要的,但是我不希望重复的数据出现在顶部。我想要 DENSE_RANK
之类的东西,但重复的数据放在最后,以避免排名值相等。
RETURN:
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
好吧,您可以枚举电子邮件,然后在 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 ;