0

2つのテーブルがあります。1つはジョブ用で、もう1つは接続用です。1つのジョブに多くの接続を設定できます。ConnetionのPKはconnid+タイムスタンプであり、JobのJOBIDを指す外部キー(JOBID)を持っています。

JOBID  | NAME
-------+-------
  id1  | Name of Job 1
  id2  | Job 2's Name

CONNID | TIMESTAMP | JOBID | AMOUNT
-------+-------+--------+----------
012    |  doesn't  |  id1  | 11
012    |  matter   |  id1  | 15
012    |           |  id1  | 20
012    |           |  id1  | 30
020    |           |  id1  | 2
020    |           |  id1  | 5
549    |           |  id2  | 19
549    |           |  id2  | 30
549    |           |  id2  | 50
549    |           |  id2  | 57
549    |           |  id2  | 60

したがって、私がやりたいのは、接続テーブルから、各ジョブの各接続の範囲の合計を取得することです。したがって、job-id1の場合は22である(30-11)+(5-2)が必要であり、job-id2の場合は41である(60-19)が必要です。接続ごとに..

SELECT 
   CONNID ,
   MAX(AMOUNT) - MIN(AMOUNT) AS range
FROM Connection 
GROUP BY CONNID 

...しかし、私はsqlに精通していないため、さらに何が必要かを理解できません(数年前に大学で単一のデータベースクラスを受講した場合のように)。それに加えて、ジョブテーブルから取得する必要があるため、ジョブの名前でソートする必要があります。これにより、さらに複雑なレイヤーが追加されると確信しています。

基本的に、結果セットは次のようになります。

NAME          | range
--------------+------
Name of Job 1 |  22
Job 2's Name  |  41

結局、これを過去24時間だけ実行できるようにしたいのですが、これは、WHERE句を追加するだけで、非常に簡単なはずです。

私が望んでいる回答には、JOBIDを使用したConnectionテーブルのクエリ(回答の最初の部分のジョブ名は気にしない)と、実際に探しているクエリの両方のクエリが含まれます。これで上記の結果セットが得られるので、そこに到達するために必要な追加の手順を明示的に確認できます。

4

3 に答える 3

2

あなたの考えは正しい方向に進んでいます、あなたはたださらに進む必要があります。

最初のグループは、接続とジョブによるものである必要があります。これにより、各ジョブの個別の範囲が取得されます。次に、これらを接続レベルでグループ化します。これは、サブクエリを使用して実行できます。

select connid, SUM(range) as range
from (SELECT CONNID, jobid, MAX(AMOUNT) - MIN(AMOUNT) AS range
      FROM Connection 
      GROUP BY CONNID, jobid
     ) cj
group by connid

ジョブの合計時間をジョブ名で並べ替える場合は、次のようにしてみてください。

select jobname, SUM(range) as range
from (SELECT CONNID, jobid, MAX(AMOUNT) - MIN(AMOUNT) AS range
      FROM Connection 
      GROUP BY CONNID, jobid
     ) cj join
     job j
     on j.jobid = cj.jobid
group by jobname

これは、接続のジョブを合計して範囲を取得し、それを合計します。

于 2013-01-04T16:29:35.847 に答える
1

あなたは近くにいます。これは2つの停止プロセスです。

  1. 各CONNID+JOBIDの最大/最小を取得します
  2. 次に、各JOBIDの各CONNID+JOBIDの最小/最大の合計を取得します

したがって、ステップ1:

SELECT 
   CONNID, JOBID
   MAX(AMOUNT) - MIN(AMOUNT) AS Range1
FROM Connection 
GROUP BY CONNID, JOBID

次に、ステップ2は、ステップ1の結果を取得し、それをさらに集約します。

SELECT JOBID, SUM([Range]) AS [Range]
FROM
(
    SELECT 
       CONNID, JOBID
       MAX(AMOUNT) - MIN(AMOUNT) AS [Range]
    FROM Connection 
    GROUP BY CONNID, JOBID
) AS t0
GROUP BY JOBID
于 2013-01-04T16:30:59.543 に答える
0

理解のために分解したい場合は、一時テーブルを使用して小計します

    SELECT 
       JOBID
       , CONNID 
       , MAX(AMOUNT) - MIN(AMOUNT) AS range
       into #subtotal
    FROM Connection 
    --Where timestamp between "low" and "high"
    GROUP BY JOBID, CONNID 

    select * from #subtotal

    Select job.Name
           , sum(range) as range 
    from #subtotal inner join job on job.jobid = #subtotal.jobid 
    group by job.Name

    drop table #subtotal
于 2013-01-04T16:46:39.587 に答える