【发布时间】:2016-10-08 20:28:30
【问题描述】:
使用 Sql Server 2008
所以我有一个名为 States 的表,它的数据如下:
DateTime | skID | TZ | DomID | EventName | SKGrpID | State
--------------------------------------------------------------------------
2016-06-08 09:22:54.010 | 1234 | 1 | 222 | 0 | 4321 | 0
2016-06-08 09:22:54.000 | 1234 | 1 | 222 | 3 | 4321 | 3
2016-06-08 09:21:56.000 | 1234 | 1 | 222 | 8 | 4321 | 4
2016-06-08 09:19:00.000 | 1234 | 1 | 222 | 7 | 4321 | 4
2016-06-08 09:18:58.000 | 1234 | 1 | 222 | 4 | 4321 | 4
2016-06-08 09:13:06.000 | 1234 | 1 | 222 | 6 | 4321 | 6
2016-06-08 09:10:42.000 | 1234 | 1 | 222 | 4 | 4321 | 4
2016-06-08 09:10:40.000 | 1234 | 1 | 222 | 1 | 5555 | 1
2016-06-08 09:00:28.003 | 1234 | 1 | 222 | 1 | 4321 | 1
可以将行视为某人接听电话的记录。如果状态为“4”,则表示他们正在通话,如果是其他任何内容,则表示他们不是。最古老的记录在底部。所以 9:10:42 的第三条记录是通话的开始,9:13:06 的记录是通话的结束(状态从 4 变为 6。)
有时调用会持续多个事件。所以在 9:18:58 的记录中,一个呼叫开始并一直持续到 9:21:56 的记录(状态开始 ->4,4,4,3
我想要一个查询,它以某种方式选择开始记录和结束记录,将它们连接起来并获得持续时间。问题是我不知道如何根据从 4 变为其他状态的状态进行选择。我也在努力弄清楚如何选择每个呼叫的每个开始(开始记录将是状态为 4 的记录,而前面的记录是其他记录(例如状态 1、4、3、6、4 , 5 将是第二条和第 5 条记录将是通话开始,3 和 6 将是通话结束。))
理想的结果应该是
StartTime, EndTime, Duration, skID, TZ, DomID, SKGrpID, StartEvent, StartState, EndEvent, EndState
我目前可以在 python 中通过查询所有行然后制作 dicts 并以这种方式匹配调用来完成此操作,但我想在 SQL 中做尽可能多的事情。做这种选择甚至可能吗?
【问题讨论】:
-
有可能。但是在 Stack Overflow 上,您应该展示您尝试过的内容。但是给你一个提示:查看 LIMIT 1 和 ORDER BY ASC/DESC。祝你好运。
-
@user3741598 我可以发布我尝试过的内容,但这基本上是大量的小查询,与我想要的完全不同。我从来没有写过这样的查询,甚至找不到一个好的起点。我了解限制的工作原理,但不知道如果一天内可能有多个电话,这将有什么帮助。
-
@user3741598 意识到我放错了标签。这是 sql-server,所以我什至不能使用限制。
标签: sql sql-server