当我运行这个查询时,我得到更多的行,然后在没有 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)
为什么会发生以及如何解决?
可以这样想:如果有两行具有相同的 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,可能需要稍作调整。)