2

例として次の表があります。

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

ジョブ フィールドは単なるテキストであり、ランタイムは整数値です。JOB の最初の 2 文字でグループ化された最大のランタイム ジョブを選択し、そのジョブを別の列に保持するにはどうすればよいですか?

次のクエリを実行できましたが、そのランタイムのジョブのフルネームがわかりません

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

ジョブ名の最初の 2 文字row_number()まで使用できます。partition byこれにより、最初の 2 文字が同じである各行に増分番号が割り当てられます。1 番目の行の実行時間が最も長くなります。

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 に答える