2011-11-10 2 views
1

내가 같은 테이블이 있습니다오라클 스칼라 서브 쿼리?

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 

즉 : value1의 각 그룹에 대한

  1. 정확한 1 enty;
  2. 이 항목의 그룹의 최대 값은 value2이어야합니다.
  3. 이 항목의 최대 값은 이어야하며 value2입니다. 인터넷에서 검색 한 후

, 나는 하나의 열로 SELECT 목록에 스칼라 하위 쿼리를 사용하여 솔루션을 가지고,하지만 같은 서브 쿼리가 열 각각에 대해 실행해야하기 때문에 그것은 매우 추한 복잡 value1, value2, value3.

SQL Cookbook은 유형을 객체로 정의하여 제조법을 설명하지만 단일 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