2

我以下表为例:

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

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

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

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

这是针对应该在 Oracle 10/11g 中运行的查询

4

2 回答 2

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
于 2013-04-27T11:02:53.867 回答
1

SQL小提琴

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)

结果

|     JOB | MAX(RUNTIME) |
--------------------------
| AR_job3 |          130 |
| EP_job1 |          100 |
于 2013-04-27T12:00:16.183 回答