带分区的ROW_NUMBER返回带有重复行的结果

时间:2012-09-11 05:15:42

标签: sql oracle

当我运行此查询时,我会获得更多行,然后在没有ROW_NUMBER()行的情况下进行查询:

SELECT DISTINCT id, value,  
ROW_NUMBER ()   over (partition by  (id)   ORDER BY  value  desc NULLS LAST  ) max  
FROM TABLE1 
WHERE id like '%1260' ORDER BY id ASC

VS

SELECT DISTINCT id, value
FROM TABLE1 
WHERE id like '%1260' ORDER BY id ASC

为什么会发生以及如何解决?

3 个答案:

答案 0 :(得分:3)

这样想:如果你有两行具有相同的id和值,第二个查询会给你一行具有不同的id,value对。第一行给你两行,一行的row_number()为1,另一行的row_number()为2。

以下数据:

ID   VALUE
--   -----
1    XXX
1    XXX

查询1将返回

ID  VALUE   MAX
--  -----   ---
1   XXX      1
1   XXX      2

查询2将返回

ID  VALUE
--  -----
1   XXX

答案 1 :(得分:2)

由于您添加了行号,因此行不再相同,因此DISTINCT无法执行任何操作。避免这种情况的一种方法是在之后使用DISTINCT添加行号

SELECT id, value, ROW_NUMBER ()   over (partition by  (id)   ORDER BY  value  desc NULLS LAST  ) max
FROM (
    SELECT DISTINCT id, value
    FROM TABLE1 
    WHERE id like '%1260'
) AS subquery
ORDER BY id ASC

(我不确定语法是否适合Oracle,可能需要稍微调整一下。)

答案 2 :(得分:0)

如果您使用的是Oracle 11g R2,请尝试此操作。

WITH DistinctRow 
AS
(
     SELECT DISTINCT id, value
     FROM TABLE1 
     WHERE id like '%1260'
)
SELECT id, value,  
       ROW_NUMBER() over (partition by (id) ORDER BY value desc NULLS LAST) max  
FROM DistinctRow 
ORDER BY max ASC