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

すなわち:

  1. value1;のグループごとに正確に1つのエンティティ。
  2. value2このエントリは、このグループのvalue1;の最大値を持っている必要があります。
  3. このエントリの最大値はvalue3、のグループ内である必要がありvalue2ます。

インターネットで検索した後、SELECTリスト内のスカラーサブクエリを単一の列として使用することで解決策が得られましたが、各列に対して同じサブクエリを実行する必要があるため、非常に醜くvalue1複雑value2ですvalue3

SQL Cookbookは、タイプをオブジェクトとして定義することによるレシピ14.10の解決策について言及していますが、私は単一のSELECTステートメントの解決策を好みます。

簡単な方法はありますか?

4

1 に答える 1

1

この場合、アナリティクスはあなたの友達です。

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
于 2011-11-10T17:35:22.177 に答える