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

IE:

  1. 每组 1 个实体value1
  2. value2此条目必须在这组中具有最大值value1;
  3. value3此条目必须具有 的组中的最大值value2

在互联网上搜索后,我得到了一个解决方案,即在SELECT列表中使用标量子查询作为单列,但它非常丑陋和复杂,因为必须为每个列运行相同的子查询value1,,。value2value3

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 回答