ROW_NUMBER with partition by 返回结果重复行

use*_*192 5 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
Run Code Online (Sandbox Code Playgroud)

VS

SELECT DISTINCT id, value
FROM TABLE1 
WHERE id like '%1260' ORDER BY id ASC
Run Code Online (Sandbox Code Playgroud)

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

DCo*_*kie 5

可以这样想:如果有两行具有相同的 id 和值,第二个查询将为您提供一行具有不同的 id、值对。第一行给出两行,一行的 row_number() 为 1,另一行的 row_number() 为 2。

对于以下数据:

ID   VALUE
--   -----
1    XXX
1    XXX
Run Code Online (Sandbox Code Playgroud)

查询 1 将返回

ID  VALUE   MAX
--  -----   ---
1   XXX      1
1   XXX      2
Run Code Online (Sandbox Code Playgroud)

查询 2 将返回

ID  VALUE
--  -----
1   XXX
Run Code Online (Sandbox Code Playgroud)


小智 5

这些行不再相同,因为您添加了行号,因此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
Run Code Online (Sandbox Code Playgroud)

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