使用 PARTITION BY 和 ROW_NUMBER 时相同的数据,不同的结果

Posted

技术标签:

【中文标题】使用 PARTITION BY 和 ROW_NUMBER 时相同的数据,不同的结果【英文标题】:Same data, different results when using PARTITION BY and ROW_NUMBER 【发布时间】:2016-01-28 10:29:09 【问题描述】:

我一直在尝试编写一个脚本来查找重复记录。 但是,这将要求其中一个字段相同,而另一个字段不同。我在我的 SELECT 中使用以下 2 行。

ROW_NUMBER () OVER (PARTITION BY col_1 ORDER BY col_2) AS 'ROWNUMBER',
ROW_NUMBER () OVER (PARTITION BY col_2 ORDER BY col_1) AS 'ROWNUMBER2', 

一旦使用了它,我就会从一个 TEMP 表中选择我的结果,其中两列都 > 1。现在这已经使我的结果在一个环境中是正确的,但是在另一个环境中运行相同的脚本时(从周末备份) 我的结果不同。

有人可以向我解释为什么会发生这种情况吗?

非常感谢。

【问题讨论】:

你能显示完整的查询吗?你是说一个查询有效而另一个无效,还是别的什么? 如果您的目标是查找重复项,我可以给您一个有效的查询而不是这个。但如果您的目标是纠正您的方法,请提供您的表格结构,并说明您要达到的目标。 嗨,Haytem,我非常乐意尝试另一种解决方法。这只是我发现的。 您要查找任何重复记录吗?因为您的陈述 “但是,这将要求其中一个字段相同而另一个字段不同” 与此不押韵。重复记录是其中一个字段不同或两者都不同的记录。 可能因为数据不同,结果不同 【参考方案1】:

为什么要使用 row_number?这根本没有必要,您应该使用 group by:

SELECT col_1,col_2 from YourTable
group by col_1,col_2 having count(*) > 1

此查询将返回所有重复的行

编辑:如果你有一个第三列,你正在根据它决定谁是一个 dup,你应该这样做:

SELECT col_3 from yourTable
group by col_3 from yourTable having count(*) > 1

【讨论】:

嗨 Sagi,原因是因为我需要第三列,这是我的主键,然后不幸的是它抛出了分组:/ 嗯,那是你的错误,你没有告诉我们你需要做什么。。如果第三列有两个以上的记录,你希望它标记重复?或者?.. 给我们数据样本和预期结果,我会修复我的查询 是的,我希望它标记重复的记录。 请编辑您的帖子并添加输入和期望输出示例

以上是关于使用 PARTITION BY 和 ROW_NUMBER 时相同的数据,不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 over 函数中使用 partition by 和 order by?

如何在 Snowflake sql 中使用 partition by 和 order by 计算不同的值?

【SQL】partition by

Oracle LISTAGG() 聚合查询用法 GROUP BY 和 PARTITION BY 的使用和比较

使用 partition by 和 case when

oracle用partition by