【发布时间】:2019-03-13 20:15:10
【问题描述】:
我有一个名为events 的表,如下所示:
timestamp | intvalue | hostname | attributes
2019-03-13 14:43:05.437| 257 | room04 | Success 000
2019-03-13 14:43:05.317| 257 | room03 | Success 000
2019-03-13 14:43:03.450| 2049 | room05 | Error 108
2019-03-13 14:43:03.393| 0 | room05 | TicketNumber=3
2019-03-13 14:43:02.347| 0 | room04 | TicketNumber=2
2019-03-13 14:43:02.257| 0 | room03 | TicketNumber=1
上面是一个包含数千行这样的表的示例。
我将用几句话解释您在此表中看到的内容。 timestamp 列给出了每个事件发生的日期和时间。在intvalue 列中,257 表示成功进入,2049 表示错误,0 表示票证发出请求。 hostname 给出了读取每张票的读卡器的名称,attributes 列给出了一些详细信息,如票号(1、2、3 等)或错误类型(即 108 或 109 ) 以及事件是否成功。
在这种情况下,有一种模式说,如果一张票请求进入并且它是有效的并且发生在像14:43:02.257这样的时间,那么成功进入的消息将被写入数据库(作为一个新的事件)在 6 秒内最多(这意味着最多 14:49:02.257)在读票器读取票后。
如果票无法进入,则在100毫秒的时间间隔后,错误消息将写入数据库。
所以在这个例子中我想做的是创建一个如下表
timestamp | intvalue | hostname | result | ticketnumber
2019-03-13 14:43:05.437| 257 | room04 | Success 000 | TicketNumber=2
2019-03-13 14:43:05.317| 257 | room03 | Success 000 | TicketNumber=1
2019-03-13 14:43:03.450| 2049 | room05 | Error 108 | TicketNumber=3
您可以看到带有TicketNumber=3 的票与结果Error 108 匹配,因为如果您查看初始表,它们的时间间隔小于100ms,其他两张票是1-to-匹配的1 与他们各自的结果,因为时间余量小于 6 秒(超过 100 毫秒)。您还可以注意到,主机名可以帮助匹配,具有TicketNumber=3 属性的行具有room05 的hostname,就像具有Error 108 属性的下一行一样。
我一直在尝试自行加入此表或使用 CTE 加入它。我使用过交叉应用,我也尝试过使用datediff 的方法,但我失败得很惨,我被卡住了。
有没有人可以帮助我并向我展示实现预期结果的正确方法?
非常感谢您的宝贵时间。
【问题讨论】:
-
请发布您最成功的尝试以及您得到的结果。
标签: sql sql-server join common-table-expression sql-server-2017