1

我有一个看起来像这样的架构:

------------------------------------
ID | Time | Type | Description | obj
------------------------------------

有些数据会像

1 | 01/01/1900 01:01:01 AM | 1 | Start | O1
2 | 01/01/1900 01:01:02 AM | 1 | Start | O2
3 | 01/01/1900 01:01:03 AM | 2 | Stop  | O1
4 | 01/01/1900 01:01:04 AM | 2 | Stop  | O2

笔记:

  • O1、O2等是进程操作的对象的ID。开始/停止时间之间将是一致的,但是每个对象会有多个开始/停止时间(该过程将多次开始和结束对特定对象的操作,并且我的查询需要为每次选择记录进程处理了该对象)
  • 为了清楚这个问题,描述说开始/停止。在实践中,它有各种各样的数据被解析出来。

所以,我需要的是最接近的开始时间和停止时间对。换句话说:对于每个开始时间,我都需要下一个最近的停止时间。因此,上面示例数据(仅选择的 id)的 select 语句的结果将返回:

(1, 3)

(2, 4)

我试过的:

SELECT  obj, 
        [Time] AS StartTime, 
        (SELECT MIN([TIME]) AS t
         FROM   TheTable
         WHERE  [Type] = 2
         HAVING MIN([Time]) > StartTime) AS StopTime
FROM     TheTable
WHERE    [Type] = 1;

这显然不起作用,因为内部选择不知道 StartTime。如果内部选择中没有 Have 子句,它会运行,但正如您所料,我会为所有条目获得相同的 StopTime。当然,这不是我需要的。

有什么办法可以解决这个问题吗?

4

2 回答 2

2
SELECT t1.obj, t1.Time as Start, min(t2.Time) as Stop
FROM TheTable t1
LEFT OUTER JOIN TheTable t2
ON t1.obj = t2.obj and t2.Description = 'Stop' and t2.Time > t1.time
WHERE t1.Description = 'Start' 
GROUP BY (t1.obj, t1.Time, t1.Description, t2.Description)

左外连接,因为可能有开始时间但还没有停止时间

于 2013-06-24T17:44:34.983 回答
1

我不确定为什么它不起作用。

您始终可以在 SubQ 中使用外列引用,您缺少“逗号”和“分组依据”顺便说一句

SELECT  obj, 
       [Time] AS StartTime,
       (SELECT MIN([TIME]) AS t
         FROM   TheTable
         WHERE  [Type] = 2
         and t1.obj = obj
         HAVING t > StartTime) AS StopTime
FROM     TheTable t1
WHERE    [Type] = 1
group by obj,TIME;

编辑:

我不是 SQL Server 专家,也不知道为什么列别名不起作用。此查询适用于我正在使用的其他数据库,例如 Teradata。无论如何,您可以使用表别名来解决此问题。

SELECT  obj, 
   [TIME] AS StartTime,
   (SELECT MIN([TIME]) As [tt]
     FROM   TheTable
     WHERE  [Type] = 2
    and t1.obj = obj
     HAVING MIN([TIME]) > t1.TIME
      ) AS StopTime
FROM     TheTable t1
WHERE    [Type] = 1
group by obj,TIME;

SQLFiddle:

http://sqlfiddle.com/#!6/3a745/14

现在,SQL Server 的 Have 子句中似乎不允许列别名:

SELECT  obj, 
   min([tdate]) AS StartTime from thetable group by obj having starttime>5 ;

列名“starttime”无效。:SELECT obj, min([tdate]) AS StartTime from thetable group by obj 的 starttime>5

于 2013-06-24T17:44:56.280 回答