2011-11-24 50 views
1

我有如下表:使用DateDiff的C#SQL分組間隔?

 
RowA  RowB date_time   RowD 
------- ------- ------------------- ------- 
ValueA1 ValueB1 01.01.2001 16:23:01 ValueD1 
ValueA2 ValueB2 01.01.2001 16:23:06 ValueD2 
ValueA3 ValueB3 01.01.2001 16:23:11 ValueD3 
ValueA4 ValueB4 03.01.2001 12:23:01 ValueD4 
ValueA5 ValueB5 03.01.2001 16:23:06 ValueD5 
ValueA6 ValueB6 03.01.2001 16:23:11 ValueD6 
ValueA7 ValueB7 03.01.2001 16:23:16 ValueD7 

表那張像約50K線。我想將這些以5秒間隔拍攝的值分組爲attempt1,嘗試2 ...等。我還需要使這些組試圖1,試圖2 ...等可訪問,以便我可以打開或關閉它們的可見性例如,使用複選框的DataGridview。

我很新的SQL,現在我找了兩天的解決方案,試圖GROUP BYDATEDIFFDATEADD,但大部分我發現沒有隻算或總結組的值的解決方案。

使用RowFilter的解決方案會很棒,但是SQL字符串也會非常感謝。

編輯

我很抱歉,我不能回答前面。你提供的兩個結果都不是我正在尋找的,我不確定我現在想用SQL來解決我想要的結果。結果表我祝願應該是這樣的(我加了一些值,因爲我意識到,我以前到現在的那些可能沒有弄清楚是我所希望的):

Attempt RowA RowB date_time   RowD   
-------- ------- ------- ------------------- ------- 
attempt1 ValueA1 ValueB1 01.01.2001 16:23:01 ValueD1 | 
attempt1 ValueA2 ValueB2 01.01.2001 16:23:06 ValueD2 | attempt1 since 5s difference (over 3 lines) 
attempt1 ValueA3 ValueB3 01.01.2001 16:23:11 ValueD3 | 
attempt2 ValueA4 ValueB4 03.01.2001 12:23:01 ValueD4 -> new and one line only attempt (difference bigger than 5s) 
attempt3 ValueA5 ValueB5 03.01.2001 16:23:06 ValueD5 | 
attempt3 ValueA6 ValueB6 03.01.2001 16:23:11 ValueD6 | attempt3 since 5s difference (over 3 lines) 
attempt3 ValueA7 ValueB7 03.01.2001 16:23:16 ValueD7 | 
attempt4 ValueA8 ValueB8 04.01.2001 02:16:53 ValueD8 - attempt4 since 5s difference... 
attempt4 ValueA9 ValueB9 04.01.2001 02:16:58 ValueD9 - (2 lines)
+1

從你的問題並不清楚什麼是*標準*爲分組數據。這是約會嗎?我怎樣才能確定什麼是*一次嘗試*?需要經過一段時間才能「做出不同的嘗試」? – splattne

+0

對不起,我很難描述這個問題,我知道。所有那些在date_time下的值相距5秒的值。在這種情況下,attempt1應該是:ValuesA1,B1,D1 - 值A3,B3,D3和attempt2:值A5,B5,D5 - 值A7,B7,D7。 –

+0

只是另一個問題:該表是否有主鍵?我能否假設所有的date_time字段都是唯一的? – splattne

回答

1

我不知道這可以只使用「普通」SQL來解決(沒有一些迭代功能,如遊標)。

如果你能保證每attemps開始在全分鐘,持續時間超過60秒以下時,這種簡單的方法可以工作:

select convert(smalldatetime, date_time), 
     min(RowA), min(RowB), min(RowD), 
     max(RowA), max(RowB), max(RowD) 
    from YourTableName 
    group by convert(smalldatetime, date_time) 

但是這隻能是因爲SMALLDATETIME消除您的DATE_TIME場的秒部分。

另外,在我的例子中,我假設RowA,B和D包含一些漸進的值,我認爲這是我的錯誤假設。

可能是你要在這裏寫一些子查詢:

更新

此查詢應該列出所有的啓動嘗試:

select t1.* 
from <YourTableName> t1 
where not exists(
    select * 
    from <YourTableName> t2 
    where t2.date_time >= dateadd(s, -5, t1.date_time) 
    and t2.date_time < t1.date_time 
) 

在您的示例中的數據結果是:

 
RowA RowB date_time    RowD 
------- ------- ----------------------- ------- 
ValueA1 ValueB1 2001-01-01 16:23:01.000 ValueD1 
ValueA4 ValueB4 2001-03-01 12:23:01.000 ValueD4 
ValueA5 ValueB5 2001-03-01 16:23:06.000 ValueD5 

我不知道你是否需要網格行中每一行的最後一行(同一行)。這會讓事情變得更復雜一點。

更新2:

如果你使用SQL Server 2005(或更新版本),你可以使用通用表表達式這樣的查詢,讓你開始和結束行單行:

with start_rows as (
    select start.* 
    from <YourTablenName> start 
    where not exists(
     select * 
     from <YourTableName> start2 
     where start2.date_time >= dateadd(s, -5, start.date_time) 
     and start2.date_time < start.date_time 
    ) 
), 
stop_rows as ( 
    select stop.* 
    from <YourTablenName> stop 
    where not exists(
     select * 
     from <YourTableName> stop2 
     where stop2.date_time <= dateadd(s, 5, stop.date_time) 
     and stop2.date_time > stop.date_time 
    ) 
) 
select start_rows.*, stop_rows.* 
from start_rows, stop_rows 
where start_rows.date_time <= stop_rows.date_time 
and not exists(
    select * from stop_rows sr2 
    where sr2.date_time < stop_rows.date_time 
    and sr2.date_time >= start_rows.date_time 
) 
order by start_rows.date_time 

在這種情況下,結果是:

 
ValueA1 ValueB1 2001-01-01 16:23:01.000 ValueD1 ValueA3 ValueB3 2001-01-01 16:23:11.000 ValueD3 
ValueA4 ValueB4 2001-03-01 12:23:01.000 ValueD4 ValueA4 ValueB4 2001-03-01 12:23:01.000 ValueD4 
ValueA5 ValueB5 2001-03-01 16:23:06.000 ValueD5 ValueA7 ValueB7 2001-03-01 16:23:16.000 ValueD7 
+0

不幸的是,解決方案並沒有幫助我。嘗試可以持續超過60秒,他們很少在整個分鐘開始,價值不是漸進的。你能告訴我一個包含子查詢的例子嗎? –

+0

@Na Smieci現在我明白了。這與我想要達到的目標完全不同。 :) – splattne