5

当我运行此查询时,我得到更多行,然后在没有 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

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

4

3 回答 3

4

可以这样想:如果您有两行具有相同的 id 和值,则第二个查询会为您提供具有不同 id、值对的行。第一个给你两行,一行 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
于 2012-09-11T05:19:54.877 回答
4

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

于 2012-09-11T05:20:01.677 回答
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
于 2012-09-11T05:26:50.850 回答