oracle标量子查询?

时间:2011-11-10 16:46:00

标签: sql oracle subquery analytics scalar-subquery

我有这样一张桌子:

 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

I.e:

  1. 每组value1确切的1个实体;
  2. 此条目的最新值value2必须为value1;
  3. 此条目必须在value3组中具有value2的最大值。
  4. 在Internet上搜索之后,我通过在SELECT列表中使用标量子查询作为单个列来获得解决方案,但它非常难看且复杂,因为必须为每个子列运行相同的子查询列value1value2value3

    SQL Cookbook通过将类型定义为对象,在配方14.10中提到了一个解决方案,但我更喜欢单个SELECT语句中的解决方案。

    任何简单的方法?

1 个答案:

答案 0 :(得分:1)

在这种情况下,Google 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