2017-10-06 88 views
3

是否有可能編寫基於日期時間列值的差,從相鄰行的值組的行的SQL查詢?通過差是否有可能組排彼此在T-SQL

讓我舉一個例子......我有一個SQL查詢是這樣的:

SELECT 
    Id, 
    StartTime, 
    EndTime, 
    datediff(second, max(StartTime), EndTime)) as Duration 
FROM Timings 
ORDER BY StartTime 

它返回的結果是這樣的:

| ID | StartTime   | EndTime    | Duration 
| 1 | 2017-10-06 10:59:48 | 2017-10-06 10:59:58 | 10 
| 2 | 2017-10-06 11:00:02 | 2017-10-06 11:00:06 | 4 
| 3 | 2017-10-06 11:00:15 | 2017-10-06 11:00:22 | 7 
| 4 | 2017-10-06 11:00:30 | 2017-10-06 11:00:39 | 9 
| 5 | 2017-10-06 15:34:31 | 2017-10-06 15:34:45 | 14 
| 6 | 2017-10-06 15:34:48 | 2017-10-06 15:34:56 | 8 
| 7 | 2017-10-06 15:34:52 | 2017-10-06 15:34:59 | 7 

這裏最重要的是,計時分兩批進行,前四項全部在上午11點左右完成,第二項在下午3點半左右完成。

我想獲得時序,平均持續時間的每個批次的開始/結束時間,並定時組中的數量的詳細信息。要做到這一點,我需要的是一種按批次對時間進行分組的方法,其中批次定義爲一組時間,在一個結束時間與下一個開始時間之間的時間小於30秒時,按開始時間排序。可能嗎?

上的真實情況一些相關的注意事項...

  • 唯一真正區分批次的特點是一個定時的結束和下一個的開始之間的差距會更大顯著。硬編碼一個固定的時間限制是可以的。
  • 如在本示例中,存在可以在一天多個批次,於是按日期分組已經出來了。
  • 在現實批,可以從幾分鐘到任何東西幾個小時之久,僅包含幾個計時,或幾千。沒有設定批次發生的時間。
  • 。注意到在線路的定時的6個& 7.多定時確實發生在平行彼此重疊,中​​的一個的結束和下一個的開始之間的大間隙的區別仍雖然站作爲識別批次的方式。

回答

3

在SQL Server 2012+:

common table expression使用窗函數lag()獲取當前行starttime相比,endtime上一行值的datediff(),然後有條件聚集sum() over()(對比於硬編碼值),以產生所述batch

;with cte as (
select * 
    , datediff(second,lag(endtime) over (order by starttime),starttime) as prev_dat 
from timings 
) 
select id, starttime, endtime, duration 
    , sum(case when coalesce(prev_dat,31)>30 then 1 else 0 end) over (
    order by starttime 
    ) as batch 
from cte 

rextester演示:http://rextester.com/OVNF90739

回報:

+----+---------------------+---------------------+----------+-------+ 
| id |  starttime  |  endtime  | duration | batch | 
+----+---------------------+---------------------+----------+-------+ 
| 1 | 2017-10-06 10:59:48 | 2017-10-06 10:59:58 |  10 |  1 | 
| 2 | 2017-10-06 11:00:02 | 2017-10-06 11:00:06 |  4 |  1 | 
| 3 | 2017-10-06 11:00:15 | 2017-10-06 11:00:22 |  7 |  1 | 
| 4 | 2017-10-06 11:00:30 | 2017-10-06 11:00:39 |  9 |  1 | 
| 5 | 2017-10-06 15:34:31 | 2017-10-06 15:34:45 |  14 |  2 | 
| 6 | 2017-10-06 15:34:48 | 2017-10-06 15:34:56 |  8 |  2 | 
| 7 | 2017-10-06 15:34:52 | 2017-10-06 15:34:59 |  7 |  2 | 
+----+---------------------+---------------------+----------+-------+ 
+0

這是輝煌的。完美工作。謝謝。 –

+0

@SimonPStevens樂於幫忙! – SqlZim

0

您可以通過日期時間的部分

group by DATEPART(StartTime, yyyy) + DATEPART(StartTime, MM) + DATEPART(StartTime, DD) 

你也不得不集團改變你選擇匹配

+0

謝謝,但這不起作用,因爲在同一天可以有多個批次,或批次可以延長多個小時,所以沒有日期時間零件組合,總是會唯一定義一個批次。 –

相關問題