2014-02-09 41 views
0

我有一個表格,其中包含DateTime列。在彼此的x秒內獲得最大行數的最佳方式是什麼?SQL獲取DateTime在x秒內的最大行數

所以,如果我有以下行:

1 2014-02-09 01:01:01 
2 2014-02-09 01:01:02 
3 2014-02-09 01:01:03 
4 2014-02-09 01:05:01 
5 2014-02-09 01:05:11 
6 2014-02-09 01:05:12 
7 2014-02-09 01:05:23 
8 2014-02-09 01:05:30 
9 2014-02-09 01:05:45 
10 2014-02-09 01:05:56 

我怎樣才能得到內的相互x秒的最大行數?即如果我指定了10秒,那麼它將返回3,因爲1,2和3行在彼此的10秒內。如果我是那麼指定60秒它會返回7(行3至10?)

感謝,

回答

1

該查詢似乎做的作業(TSQL)

WITH CTE AS 
(
    SELECT Id, value, CNT.X 
    FROM 
     tbl T1 
    OUTER APPLY 
    (
    SELECT COUNT(*) X FROM tbl T2 
    WHERE Datediff(second, T1.value, T2.value) BETWEEN 0 AND 10 
) CNT 
) 
SELECT MAX(X) FROM CTE 

這裏是一個小提琴,將只顯示CTE本身(與統計每一行):

http://sqlfiddle.com/#!6/1a323/12

+0

作品(雖然這是可以理解的跨數據的15個百萬行有點慢!):

如果你有運氣的DBMS支持使用範圍(如Oracle)的窗聚合函數,這應該跑得更快謝謝。 – JoeS

0

試試這個:

select count(*) as No_Of_Records 
from tab 
group by datepart(hh, datfld) 
,datepart(mi, datfld), 
datepart(ss,datfld)/10*10 

看到這裏演示http://sqlfiddle.com/#!3/1badb/1

+0

這是不正確的,第一次更改爲'01:00:59'它沒有連接到第二和第三,因爲你使用固定塊,而不是計算差異。 – KekuSemau

2

你沒有指定你使用的DBMS。

本標準SQL應該運行(幾乎)無處不在,你只需要修改怎麼加秒的時間戳:

SELECT MAX(cnt) 
FROM 
(
    SELECT Id, value, 
     (SELECT COUNT(*) FROM tbl t2 
     WHERE t2.value BETWEEN t1.value AND t1.value + INTERVAL '10' SECOND) AS cnt 
    FROM tbl AS t1 
) AS dt 

表現應類似於KekuSemau的查詢。完美

SELECT MAX(cnt) 
FROM 
(
    SELECT Id, value, 
     COUNT(*) 
     OVER (ORDER BY value 
     RANGE BETWEEN CURRENT ROW AND INTERVAL '10' SECOND FOLLOWING) AS cnt 
    FROM tbl AS t1 
) AS dt