这听起来有些令人费解,所以我会尽量保持简短。本质上,我需要运行一个基于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
的行,我希望有1
和2
行(它只需要一个最大值的实例,其余各行的值无关紧要)。对于值为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的“文档”中,我找不到任何有用的东西。
答案 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);
输出:
+-----+--------+-------+------+
| 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