скалярный подзапрос оракула? - PullRequest
1 голос
/ 10 ноября 2011

У меня есть такая таблица:

 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 запись для каждой группы value1;
  2. Эта запись должна иметь максимальное значение value2 в этой группе value1;
  3. Эта запись должна иметь максимальное значение value3 в группе value2.

После поиска в Интернете я нашел решение, используя скалярный подзапрос в списке SELECT как один столбец, но он очень уродлив и сложен, так как для каждого столбца должен выполняться один и тот же подзапрос value1, value2, value3.

Поваренная книга SQL упоминает решение в рецепте 14.10 путем определения типа как объекта, но я предпочитаю решение в одном операторе SELECT.

Есть ли простой способ?

1 Ответ

1 голос
/ 10 ноября 2011

Аналитика - ваш друг в этом случае:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...