0

我有两张桌子——一张用于 Jobs,另一张用于 Connections。一份工作可以有很多联系。Connetion 的 PK 是 connid + timestamp,它有一个外键(JOBID)指向 Job 的 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,我想要(30-11)+(5-2),即22,对于job-id2,我想要(60-19),即41。现在我可以弄清楚如何做最大值减去最小值对于每个连接...

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

你的思路是正确的,你只需要走得更远。

第一个 group by 需要按连接和工作。这将为您提供每项工作的个人范围。然后,您想在连接级别将它们组合在一起。您可以使用子查询来执行此操作:

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

你很近。这是一个两站过程:

  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 回答