2011-11-10 66 views
1

我有這樣一個表:oracle標量子查詢?

name value1 value2 value3 
--------------------------- 
name1 1  1  1 
name2 1  1  2 
name3 2  2  11 
name4 2  12  2 
name5 3  3  8 
name6 3  3  2 

我需要的是這樣的結果:

name value1 value2 value3 
--------------------------- 
name2 1  1  2 
name4 2  12  2 
name5 3  3  8 

即:

  1. 精確1個enty每組value1;
  2. 此條目必須有最大數量value2這組value1;
  3. 此條目在value2的組中必須具有最大值value3

已經搜索到互聯網後,我有在SELECT列表,一列使用標量子查詢的解決方案,但它是非常醜陋的,複雜的,因爲同樣的子查詢必須爲每列運行value1value2value3

SQL Cookbook在配方14.10中提到了一個解決方案,通過將類型定義爲對象,但我更喜歡單個SELECT語句中的解決方案。

任何簡單的方法?

回答

1

Analytics(分析)是你的朋友在這種情況下:

SQL> CREATE TABLE t (NAME VARCHAR2(32), v1 INTEGER, v2 INTEGER, v3 INTEGER); 

Table created 
SQL> INSERT INTO t VALUES ('name1',1,1,1); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name2',1,1,2); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name3',2,2,11); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name4',2,12,2); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name5',3,3,8); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name6',3,3,2); 

1 row inserted 
SQL> SELECT NAME, v1, v2, v3 
     FROM (SELECT NAME, v1, v2, v3 
        , MAX(v2) OVER(PARTITION BY v1) mv2 
        , MAX(v3) OVER(PARTITION BY v1,v2) mv3 
       FROM t) 
     WHERE v2 = mv2 
     AND v3 = mv3 
     ORDER BY v1; 

NAME V1 V2 V3 
------ -- -- -- 
name2 1 1 2 
name4 2 12 2 
name5 3 3 8 
+0

非常感謝!美麗而快速! – chance