我正在处理Oracle 11g数据库查询,该查询需要检索表中重复行之间的最高NUM值列表。
以下是我的背景示例:
ID | NUM
------------
1 | 1111
1 | 2222
2 | 3333
2 | 4444
3 | 5555
3 | 6666
以下是执行查询后我期望的结果:
NUM
----
2222
4444
6666
我知道如何在数字列表中获取GREATEST值,但我完全没有猜测如何对两行进行分组,如果它们具有相同的ID,则获取它们之间的最大列值。
Programmaticaly它很容易实现,但使用SQL它对我来说往往不那么直观。欢迎任何建议或建议,因为我甚至不知道哪个功能可以帮助我在Oracle中这样做。
谢谢!
答案 0 :(得分:5)
这是GROUP BY
的典型用例。假设你的Num字段可以比较:
SELECT ID, MAX(NUM) as Max
FROM myTable
GROUP BY ID
如果您不想选择ID(如您提供的输出中所示),则可以运行
SELECT Max
FROM (
SELECT ID, MAX(NUM) as Max
FROM myTable
GROUP BY ID
) results
here是SQL小提琴
修改:如果您NUM
VARCHAR2
,如后所述Int
,那么您必须将其转换为{{1}}。 See this question
答案 1 :(得分:0)
我建议的最有效方式是
SELECT ids,
value
FROM (SELECT ids,
value,
max(value)
over (
PARTITION BY ids) max_value
FROM test)
WHERE value = max_value;
这要求查询保持到目前为止遇到的最大值的每个id的单个值。如果找到新的最大值,则修改现有值,否则丢弃新值。必须在内存中保留的元素总数与id的数量有关,而不是与扫描的行数有关。
请参阅此SQLFIDDLE