Oracle SQL:从特定的多个条件获取所有行的最大数量

时间:2014-05-06 08:52:34

标签: sql oracle

我有下表名为foo:

ID | D1  | D2  | D3 |
---------------------
1 | 47  | 3   | 71 |
2 | 47  | 98  | 82 | 
3 | 0   | 99  | 3  |
4 | 3   | 100 | 6  |
5 | 48  | 10  | 3  |
6 | 49  | 12  | 4  |

我想运行一个选择查询,结果显示如下

ID | D1  | D2  | D3 | Result |
------------------------------
 1 | 47  | 3   | 71 | D3     |
 2 | 47  | 98  | 82 | D2     | 
 3 | 0   | 99  | 3  | D2     |
 4 | 3   | 100 | 6  | D2     |
 5 | 48  | 10  | 3  | D1     |
 6 | 49  | 12  | 4  | D1     |

所以,基本上我想得到D1,D2,D3列之间的最大值除以id。 正如您所看到的,ID 1在结果列中具有D3,因为它之间的最大值 D1:D2:D3

表示4:3:71,最大值为71.这就是为什么结果显示' D3'

有没有办法在SQL查询中执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:3)

对于Oracle,请尝试这个

select foo.*, case when greatest(d1, d2, d3) = d1 then 'D1'
                   when greatest(d1, d2, d3) = d2 then 'D2'
                   when greatest(d1, d2, d3) = d3 then 'D3'
              end result
from foo

答案 1 :(得分:0)

考虑以下因素 - 标准化方法......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL 
,d INT NOT NULL
,val INT NOT NULL
,PRIMARY KEY(id,d)
);

INSERT INTO my_table VALUES
(1,1,47),
(2,1,47),
(3,1,0),
(4,1,3),
(5,1,48),
(6,1,49),
(1,2,3),
(2,2,98),
(3,2,99),
(4,2,100),
(5,2,10),
(6,2,12),
(1,3,71),
(2,3,82),
(3,3,3),
(4,3,6),
(5,3,3),
(6,3,4);

SELECT * FROM my_table;
+----+---+-----+
| id | d | val |
+----+---+-----+
|  1 | 1 |  47 |
|  1 | 2 |   3 |
|  1 | 3 |  71 |
|  2 | 1 |  47 |
|  2 | 2 |  98 |
|  2 | 3 |  82 |
|  3 | 1 |   0 |
|  3 | 2 |  99 |
|  3 | 3 |   3 |
|  4 | 1 |   3 |
|  4 | 2 | 100 |
|  4 | 3 |   6 |
|  5 | 1 |  48 |
|  5 | 2 |  10 |
|  5 | 3 |   3 |
|  6 | 1 |  49 |
|  6 | 2 |  12 |
|  6 | 3 |   4 |
+----+---+-----+

SELECT x.* 
  FROM my_table x 
  JOIN  
     ( SELECT id,MAX(val) max_val FROM my_table GROUP BY id) y 
    ON y.id = x.id 
   AND y.max_val = x.val;
+----+---+-----+
| id | d | val |
+----+---+-----+
|  1 | 3 |  71 |
|  2 | 2 |  98 |
|  3 | 2 |  99 |
|  4 | 2 | 100 |
|  5 | 1 |  48 |
|  6 | 1 |  49 |
+----+---+-----+

(这是作为一个MySQL解决方案 - 我不熟悉ORACLE语法,所以如果没有移植就道歉)

这是否回答了您的评论?

SELECT x.* , y.max_val
  FROM my_table x
  JOIN
     ( SELECT id,MAX(val) max_val FROM my_table GROUP BY id) y
    ON y.id = x.id ;
+----+---+-----+---------+
| id | d | val | max_val |
+----+---+-----+---------+
|  1 | 1 |  47 |      71 |
|  1 | 2 |   3 |      71 |
|  1 | 3 |  71 |      71 |
|  2 | 1 |  47 |      98 |
|  2 | 2 |  98 |      98 |
|  2 | 3 |  82 |      98 |
|  3 | 1 |   0 |      99 |
|  3 | 2 |  99 |      99 |
|  3 | 3 |   3 |      99 |
|  4 | 1 |   3 |     100 |
|  4 | 2 | 100 |     100 |
|  4 | 3 |   6 |     100 |
|  5 | 1 |  48 |      48 |
|  5 | 2 |  10 |      48 |
|  5 | 3 |   3 |      48 |
|  6 | 1 |  49 |      49 |
|  6 | 2 |  12 |      49 |
|  6 | 3 |   4 |      49 |
+----+---+-----+---------+