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

Oracle SQL:从特定的多个条件获取所有行的最大数目,sql,oracle,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 | 我想运行一个select查询,并让结果如下所示 ID | D1 | D2 | D3 | Result | ---------

我有一个名为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  |
我想运行一个select查询,并让结果如下所示

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查询中是否有这样做的方法


谢谢

对于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

对于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

对于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

对于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

考虑以下内容-一种规范化方法

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 |
+----+---+-----+---------+

考虑以下内容-一种规范化方法

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 |
+----+---+-----+---------+

考虑以下内容-一种规范化方法

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 |
+----+---+-----+---------+

考虑以下内容-一种规范化方法

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 |
+----+---+-----+---------+



mysql还是oracle?正确地标记它。@AbhikChakraborty:它实际上是Oracle数据库,但我也想知道如何在SQL查询中进行标记?@草莓:先生,你是什么意思?很抱歉,我没有得到它。请规范化您的数据。规范化是关系数据库的基本概念。“得到它”很重要。这里提供的其他答案只是粉饰。虽然规范化当然是关系数据库的核心概念,但这个问题与它没有直接关系。当然,您可以为D1、D2和D3值添加一个详细信息表,但是如果没有关于所存储数据类型的更多信息,就无法确定这是否更合理。mysql还是oracle?正确地标记它。@AbhikChakraborty:它实际上是Oracle数据库,但我也想知道如何在SQL查询中进行标记?@草莓:先生,你是什么意思?很抱歉,我没有得到它。请规范化您的数据。规范化是关系数据库的基本概念。“得到它”很重要。这里提供的其他答案只是粉饰。虽然规范化当然是关系数据库的核心概念,但这个问题与它没有直接关系。当然,您可以为D1、D2和D3值添加一个详细信息表,但是如果没有关于所存储数据类型的更多信息,就无法确定这是否更合理。mysql还是oracle?正确地标记它。@AbhikChakraborty:它实际上是Oracle数据库,但我也想知道如何在SQL查询中进行标记?@草莓:先生,你是什么意思?很抱歉,我没有得到它。请规范化您的数据。规范化是关系数据库的基本概念。“得到它”很重要。这里提供的其他答案只是粉饰。虽然规范化当然是关系数据库的核心概念,但这个问题与它没有直接关系。当然,您可以为D1、D2和D3值添加一个详细信息表,但是如果没有关于所存储数据类型的更多信息,就无法确定这是否更合理。mysql还是oracle?正确地标记它。@AbhikChakraborty:它实际上是Oracle数据库,但我也想知道如何在SQL查询中进行标记?@草莓:先生,你是什么意思?很抱歉,我没有得到它。请规范化您的数据。规范化是关系数据库的基本概念。“得到它”很重要。这里提供的其他答案只是粉饰。虽然规范化当然是关系数据库的核心概念,但这个问题与它没有直接关系。当然,您可以为D1、D2和D3值添加详细信息表,但如果没有关于存储数据类型的更多信息,则无法确定这是否更合理。如果输入数据可能包含空值,则最好添加一些NVL()调用-greatest()如果其中一个参数为NULL,则返回NULL。这取决于主题。请告诉我如何使用上面提到的NVL()调用好吗?由于某些列中的数据值可能为null。当然,如果某些字段包含null,您希望得到什么结果?在上面的查询中,若一个或多个字段为空,则结果为空。您可以和
nvl
将null替换为某个值,例如
nvl(d1,0)
如果输入数据可能包含null值,添加一些nvl()调用将是明智的-如果其中一个参数为null,则magest()将返回null。这取决于主题。您能否告诉我如何使用您上面提到的nvl()调用?由于某些列中的数据值可能为null。当然,如果某些字段包含null,您希望得到什么结果?在上面的查询中,若一个或多个字段为空,则结果为空。您可以和
nvl
将null替换为某个值,例如
nvl(d1,0)
如果输入数据可能包含null值,添加一些nvl()调用将是明智的-如果其中一个参数为null,则magest()将返回null。这取决于主题。您能否告诉我如何使用您上面提到的nvl()调用?由于某些列中的数据值可能为null。当然,如果某些字段包含null,您希望得到什么结果?在上面的查询中,若一个或多个字段为空,则结果为空。您可以和
nvl
将null替换为某个值,例如
nvl(d1,0)
如果输入数据可能包含null值,最好添加一些nvl()调用