SQL查找首次出现

时间:2015-10-07 18:53:07

标签: sql sql-server ssms

我现在已经在这里待了大约一个小时,而且几乎没有任何进展 - 我以为我会来这里寻求帮助/建议。

所以,鉴于我的表格样本:

+-----------+-----------------------------+--------------+
| MachineID | DateTime                    | AlertType    |
+-----------+-----------------------------+--------------+
| 56        | 2015-10-05 00:00:23.0000000 | 2000         |
| 42        | 2015-10-05 00:01:26.0000000 | 1006         |
| 50        | 2015-10-05 00:08:33.0000000 | 1018         |
| 56        | 2015-10-05 00:08:48.0000000 | 2003         |
| 56        | 2015-10-05 00:10:15.0000000 | 2000         |
| 67        | 2015-10-05 00:11:59.0000000 | 3001         |
| 60        | 2015-10-05 00:13:02.0000000 | 1006         |
| 67        | 2015-10-05 00:13:08.0000000 | 3000         |
| 56        | 2015-10-05 00:13:09.0000000 | 2003         |
| 67        | 2015-10-05 00:14:50.0000000 | 1018         |
| 67        | 2015-10-05 00:15:00.0000000 | 1018         |
| 47        | 2015-10-05 00:16:55.0000000 | 1006         |
+-----------+-----------------------------+--------------+

我如何第一次出现MachineID w / {2000} AlertType 以及2003年的同一MachineID w /和AlertType的最后一次出现。

这是我尝试过的 - 但它没有输出我期望的结果。

SELECT *
FROM [Alerts] a
where 
    DateTime >= '2015-10-05 00:00:00'
    AND  DateTime <= '2015-10-06 00:00:00'
    and not exists(
        select b.MachineID 
        from [Alerts] b
        where   b.AlertType=a.AlertType and
                b.MachineID<a.MachineID
    )
order by a.DateTime ASC

编辑: 以上代码无法获得我想要的内容,因为我并没有特别告诉它搜索AlertType = 2000AlertType = 2003,但即便如此当我尝试这个时,我仍然无法收集我想要的结果。

以下是我想要显示的输出:

+-----------+-----------------------------+--------------+
| MachineID | DateTime                    | AlertType    |
+-----------+-----------------------------+--------------+
| 56        | 2015-10-05 00:00:23.0000000 | 2000         |
| 56        | 2015-10-05 00:13:09.0000000 | 2003         |
+-----------+-----------------------------+--------------+

对此有任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

不确定,但是:

select * from [Table] 
WHERE [DateTime] IN (
            SELECT MIN([DateTime]) as [DateTime] 
            FROM [Table] 
            WHERE AlertType = 2000 
            GROUP BY MachineId 
                UNION ALL 
            SELECT MAX([DateTime]) as [DateTime] 
            FROM [Table] 
            WHERE AlertType = 2003 
            GROUP BY MachineId)
ORDER BY MachineId, AlertType

答案 1 :(得分:1)

看起来你的外部部分记录了2015-10-05到2015-10-06之间的所有记录,其中包括按日期排序的所有记录。内部部分仅在没有记录符合外部日期范围时发生。

看起来GSazheniuk说得对,但我不确定你是否只想要2条记录或者与MachineID和两条警报匹配的所有内容?

答案 2 :(得分:0)

不确定您的尝试与您的问题有什么关系,但要回答这个问题:

  

我如何获得第一次出现的带有AlertType的MachineID   2000和最后一次出现相同的MachineID w /和AlertType   2003。

简单:

Image

答案 3 :(得分:0)

我认为每个人都错过了你的警报类型不是决定因素,而是一个补充。 这应该可以满足您的需求。我走过了整个过程。         `IF OBJECT_ID('tempdb ..#alerts')IS NOT NULL DROP table #alerts

put($localFile, $remotePath)

我个人使用交叉申请来执行这样的任务,但CTE对于这项练习更加友好。