我现在已经在这里待了大约一个小时,而且几乎没有任何进展 - 我以为我会来这里寻求帮助/建议。
所以,鉴于我的表格样本:
+-----------+-----------------------------+--------------+
| 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 = 2000
或AlertType = 2003
,但即便如此当我尝试这个时,我仍然无法收集我想要的结果。
以下是我想要显示的输出:
+-----------+-----------------------------+--------------+
| MachineID | DateTime | AlertType |
+-----------+-----------------------------+--------------+
| 56 | 2015-10-05 00:00:23.0000000 | 2000 |
| 56 | 2015-10-05 00:13:09.0000000 | 2003 |
+-----------+-----------------------------+--------------+
对此有任何帮助将不胜感激!
答案 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对于这项练习更加友好。