为每组名称获取最高价值

时间:2013-04-27 10:57:33

标签: sql oracle greatest-n-per-group top-n

我有下表作为例子:

Job_name   RunTime
AR_job1      100
AR_job2      120
AR_job3      130
EP_job1      100
EP_job2       80

作业字段只是文本,运行时是整数值 如何为按JOB的前两个字母分组的那些人选择最大的运行时作业,但是将作业保留在另一列中?

我能够执行以下查询,但后来我不知道该运行时的作业全名是什么

select substr(job_name,0,2) Code, MAX(RunTime) 
FROM table1 group by substr(job_name,0,2)

这适用于应在Oracle 10 / 11g中运行的查询 的问候,

2 个答案:

答案 0 :(得分:3)

您可以使用row_number() partition by作业名称的前两个字符。这样做是为每行添加一个增量数字,前两个字符相同。第一行的行将具有最高的运行时间:

select  *
from    (
        select  row_number() over (
                    partition by substr(job_name,0,2) 
                    order by RunTime desc) as rn
        ,       Job_name
        ,       RunTime
        from    YourTable
        ) SubQueryAlias
where   rn = 1

答案 1 :(得分:1)

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE t
    ("JOB_NAME" varchar2(7), "RUNTIME" int)
;

INSERT ALL 
    INTO t ("JOB_NAME", "RUNTIME")
         VALUES ('AR_job1', 100)
    INTO t ("JOB_NAME", "RUNTIME")
         VALUES ('AR_job2', 120)
    INTO t ("JOB_NAME", "RUNTIME")
         VALUES ('AR_job3', 130)
    INTO t ("JOB_NAME", "RUNTIME")
         VALUES ('EP_job1', 100)
    INTO t ("JOB_NAME", "RUNTIME")
         VALUES ('EP_job2', 80)
SELECT * FROM dual
;

查询1

select max(job_name) keep (dense_rank first order by runtime desc) job
,      max(runtime) as maxruntime
from t 
group by substr(job_name, 1,2)

<强> Results

|     JOB | MAX(RUNTIME) |
--------------------------
| AR_job3 |          130 |
| EP_job1 |          100 |