2015-10-20 80 views
2

我有這個表:的Oracle SQL SELECT查詢

select * from scott.test; 

a b c 
--------- 
26 R 4 
26 T 5 
26 S 2 
25 Y 2 
25 U 3 
24 X 3 
22 Z 3 
21 P 3 

我需要的是這樣的: 對於給定的 「一」 我要提取所有的細節(A,B,C),如果有多一個「a」,我想只提取最高的「c」。 例如,對於26,我想只提取:

a b c 
26 T 5 

我已經以這種方式做到了這一點:

select * from scott.test where a = 26 and c = (select max(c) from scott.test where a = 26); 

,但我需要它只有一個選擇(內選擇不選擇)。它可以完成嗎?謝謝!

+2

您需要使用** CASE **和** ROW_NUMBER **分析函數。在你的問題中,你的意思是** asap **?爲了儘快得到答案,你應該提供一個工作測試用例。創建並插入語句。至少SQL小提琴。顯示數據對誰想幫助你沒有幫助。你在一張桌子上執行一個SQL,所以只看數據的人只能* GUESS *而不能給你完全正確的答案。 –

+3

@LalitKumarB我認爲他希望答案儘快(儘快) - *我認爲這是非常粗魯* –

+0

@RaduGheorghiu我知道。我正在向OP解釋。 –

回答

0

是否這樣? -

WITH test 
    AS (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual 
     UNION ALL 
     SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual 
     UNION ALL 
     SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual 
     UNION ALL 
     SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual 
     UNION ALL 
     SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual 
     UNION ALL 
     SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual 
     UNION ALL 
     SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual 
     UNION ALL 
     SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual) 
SELECT a, b, c 
    FROM (SELECT a, b, c, max(c) OVER (PARTITION BY a) AS max_c 
      FROM test 
     WHERE A = 26) 
WHERE c = max_c 
+0

它看起來不像..一個選擇,但兩個,即使它們嵌套。 –

+0

如果@ user3913719講述了單個表掃描,那麼多少個子查詢就無關緊要。不知道「選擇內不選擇」是什麼意思:) – Stawros

+0

是的,我同意你的看法,但是OP是否提到過任何有關表掃描的內容? –

1

使用ROW_NUMBER()解析功能,你可以實現它。但是,您需要使用子查詢來完成此操作。但你總是可以用WITH從句來看它的不同。

以下查詢會提示您輸入列a的值,然後返回列的最大值爲c的行。 WITH子句的第一部分僅用於構建用於演示的示例數據,您只需要第二部分,即t

例如,

a26輸入值:

SQL> WITH data AS 
    2 (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual 
    3 UNION ALL 
    4 SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual 
    5 UNION ALL 
    6 SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual 
    7 UNION ALL 
    8 SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual 
    9 UNION ALL 
10 SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual 
11 UNION ALL 
12 SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual 
13 UNION ALL 
14 SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual 
15 UNION ALL 
16 SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual 
17 ), 
18 t AS 
19 (SELECT a,b,c,row_number() OVER(PARTITION BY a ORDER BY c DESC) rn FROM DATA 
20 ) 
21 SELECT a,b,c FROM t WHERE a = &1 AND rn = 1; 
Enter value for 1: 26 
old 21: SELECT a,b,c FROM t WHERE a = &1 AND rn = 1 
new 21: SELECT a,b,c FROM t WHERE a = 26 AND rn = 1 

     A B   C 
---------- - ---------- 
     26 T   5 

a25輸入值:

SQL> WITH data AS 
    2 (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual 
    3 UNION ALL 
    4 SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual 
    5 UNION ALL 
    6 SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual 
    7 UNION ALL 
    8 SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual 
    9 UNION ALL 
10 SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual 
11 UNION ALL 
12 SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual 
13 UNION ALL 
14 SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual 
15 UNION ALL 
16 SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual 
17 ), 
18 t AS 
19 (SELECT a,b,c,row_number() OVER(PARTITION BY a ORDER BY c DESC) rn FROM DATA 
20 ) 
21 SELECT a,b,c FROM t WHERE a = &1 AND rn = 1; 
Enter value for 1: 25 
old 21: SELECT a,b,c FROM t WHERE a = &1 AND rn = 1 
new 21: SELECT a,b,c FROM t WHERE a = 25 AND rn = 1 

     A B   C 
---------- - ---------- 
     25 U   3 
0

試試這個。它可能應該工作:)。

select a,max(b) keep (dense_rank first order by c desc) b , max(c) keep (dense_rank first order by c desc) c from test 
    where a = 26 
    group by a