我有这样一张桌子:
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:
value1
确切的1个实体; value2
必须为value1
; value3
组中具有value2
的最大值。在Internet上搜索之后,我通过在SELECT
列表中使用标量子查询作为单个列来获得解决方案,但它非常难看且复杂,因为必须为每个子列运行相同的子查询列value1
,value2
,value3
。
SQL Cookbook通过将类型定义为对象,在配方14.10中提到了一个解决方案,但我更喜欢单个SELECT语句中的解决方案。
任何简单的方法?
答案 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