根据不同列中的值从Oracle中的不同组中提取多个记录

时间:2019-05-17 18:05:09

标签: sql oracle oracle11g

这听起来有些令人费解,所以我会尽量保持简短。本质上,我需要运行一个基于COL1对结果进行分组的查询,然后从那里查看COL2中的最大值。一旦确定了COL2中的最高值,就应该查看COL3中的值,然后提取组中具有相同值的每条记录。表中还有其他一些列,我需要这些列中的值,但查询逻辑中未使用它们。

SOME_TABLE

  COL1    COL2     COL3
1 12345   100      A
2 12345   (null)   A
3 12345   50       B
4 12346   0        A
5 12346   (null)   A
6 12346   100      B
7 12346   20       B

因此,在此示例中,对于COL1值为12345的行,我希望有12行(它只需要一个最大值的实例,其余各行的值无关紧要)。对于值为COL1的{​​{1}},我需要在12346中带有B的行。

以下是一种可读格式的示例输出:

COL3

我尝试了许多不同的查询和查询的排列,但是都没有运气。我不确定发布一堆行不通的查询有多建设性。我尝试过的最大的两种方法包括常规的 COL1 COL2 COL3 1 12345 100 A 2 12345 (null) A 6 12346 100 B 7 12346 20 B 语句,然后在GROUP BY上使用PARTITION BY

我还应该注意,我尝试在应用程序的COL1端实现这一点,并在C#脚本中使用循环,但是结果不一而足,或者性能非常差。

在SO或Oracle的“文档”中,我找不到任何有用的东西。

3 个答案:

答案 0 :(得分:1)

您希望col3值与col1的最大值匹配的所有行。相关子查询似乎是表达此信息的最自然的方式:

select t.*
from t
where t.col3 = (select max(t2.col3) keep (dense_rank first order by col2 desc)
                from t t2
                where t2.col1 = t.col1
               );

keep表达式只是说“将col3的第一个值保留为col2的最大值。

答案 1 :(得分:0)

您可以使用窗口功能:

WITH cte AS (SELECT t.*, MAX(col2) OVER(PARTITION BY col1) m FROM t)
SELECT *
FROM t
WHERE (COL1,COL3) IN (SELECT col1, col3 FROM cte WHERE col2 = m);

db<>fiddle demo

输出:

+-----+--------+-------+------+
| ID  | COL1   | COL2  | COL3 |
+-----+--------+-------+------+
|  2  | 12345  |       | A    |
|  1  | 12345  |  100  | A    |
|  7  | 12346  |   20  | B    |
|  6  | 12346  |  100  | B    |
+-----+--------+-------+------+

答案 2 :(得分:0)

样本预期输出可能会有所帮助。试试这个:

    select col1, col3, max(col3)
    from table
    group by col1, col3