oracle ROW_NUMBER和partition by返回包含重复行的结果

fcwjkofz  于 2023-08-04  发布在  Oracle
关注(0)|答案(3)|浏览(147)

当我运行这个查询时,我得到的行比没有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


为什么会发生这种情况,如何解决?

yvt65v4c

yvt65v4c1#

这样想吧:如果有两行具有相同的id和value,则第二个查询将提供一行具有不同的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

azpvetkf

azpvetkf2#

因为添加了行号,所以行不再相同,所以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,可能需要稍微调整。

wtzytmuj

wtzytmuj3#

如果您正在使用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

字符串

相关问题