我有一個簡單的表像這樣:如何SQL轉換爲LINQ與前瞻(導致類似查詢)
[Timestamp] DATETIME,
[Value] NVARCHAR(50)
所有[時間戳值是唯一的,但[超值]是不是唯一的。
我想查找何時每個[Value]開始和停止。我有以下T-SQL(SQL 2008),這似乎工作正常,儘管任何改進建議都將受到讚賞,因爲在2012年之前的T-SQL中實現領導運營商的模式很好。
SELECT
h1.[Value] AS 'Event ID',
MIN(h1.[Timestamp]) AS 'Start Time',
h2.[Timestamp] AS 'End Time',
DATEDIFF(second, MIN(h1.[Timestamp]), h2.[Timestamp]) AS 'Duration (sec)'
FROM
#RawHistory h1
INNER JOIN
#RawHistory h2
ON h2.[Timestamp] =
(
SELECT TOP 1
h3.[Timestamp]
FROM
#RawHistory h3
WHERE
h3.[Value] <> h1.[Value]
AND
h3.[Timestamp] > h1.[Timestamp]
ORDER BY
h3.[Timestamp] ASC
)
GROUP BY
h1.[Value], h2.[Timestamp]
ORDER BY
MIN(h1.[Timestamp])
因此,鑑於此輸入:
Timestamp Value
======================= ======
2013-12-18 20:26:00.000 Violet
2013-12-18 20:30:00.000 Red
2013-12-18 20:35:00.000 Red
2013-12-18 20:40:00.000 Orange
2013-12-18 20:50:00.000 Yellow
2013-12-18 21:00:00.000 Green
2013-12-18 21:05:00.000 Green
2013-12-18 21:07:00.000 Green
2013-12-18 21:10:00.000 Blue
2013-12-18 21:20:00.000 Indigo
2013-12-18 21:30:00.000 Violet
2013-12-18 21:30:05.000 Violet
2013-12-18 21:40:00.000 Red
2013-12-18 21:50:00.000 Orange
2013-12-18 22:00:00.000 Yellow
2013-12-18 22:10:00.000 Green
我希望這樣的輸出:
Event ID Start Time End Time Duration (sec)
======== ======================= ======================= =============
Violet 2013-12-18 20:26:00.000 2013-12-18 20:30:00.000 240
Red 2013-12-18 20:30:00.000 2013-12-18 20:40:00.000 600
Orange 2013-12-18 20:40:00.000 2013-12-18 20:50:00.000 600
Yellow 2013-12-18 20:50:00.000 2013-12-18 21:00:00.000 600
Green 2013-12-18 21:00:00.000 2013-12-18 21:10:00.000 600
Blue 2013-12-18 21:10:00.000 2013-12-18 21:20:00.000 600
Indigo 2013-12-18 21:20:00.000 2013-12-18 21:30:00.000 600
Violet 2013-12-18 21:30:00.000 2013-12-18 21:40:00.000 600
Red 2013-12-18 21:40:00.000 2013-12-18 21:50:00.000 600
Orange 2013-12-18 21:50:00.000 2013-12-18 22:00:00.000 600
Yellow 2013-12-18 22:00:00.000 2013-12-18 22:10:00.000 600
注意,不返回任何綠色的最後一個實例,因爲沒有「結束日期「。
但是,我真正感興趣的是能夠使用C#中的LINQ對類似的Values和Timestamps列表執行相同類型的查詢。不是針對SQL數據源,而是針對具有Value和Timestamp屬性的POCO對象列表。
所以,如果我有類似
class VT
{
string Value { get; set; }
DateTime Timestamp { get; set; }
}
類和我有一個
List<VT> vts
這些對象的
,這將是在該名單將執行相同的LINQ的聲明轉型的類型?
我以前實現這個使用了跟蹤,當值變化的狀態機模式 - 這不是很明顯的是時間序列數據可能對在連續時間的值相同的多個條目,如
T1, Red
T2, Red
T3, Red
T4, Yellow
T5, Yellow
T6, Blue
等等。因爲SQL查找與當前值不同的下一個值的時間戳,所以SQL起作用。這可以使用Linq嗎?
可以肯定,與連續值上面的例子中,最終的結果應該是:
Red, T1, T4
Yellow, T4, T6
所以連續讀數應合併成一個單一的讀數。查看SQL查詢如何查找與展望中的當前記錄不同的值的下一條記錄。
我編輯了原始數據集示例以包含重複的連續值。輸出不會改變。
我可以爲secondList的Skip()子句添加Where子句,告訴它跳到列表中與第一個列表中元素的值不同的下一個元素?如果是這樣,那看起來如何?看到我對這個問題的澄清。我不一定在尋找下一個記錄,而是下一個記錄有不同的值。 – noelhx
我不知道這是否可以用標準LINQ操作符完成,但一般問題在此解決:http://msdn.microsoft.com/vstudio/cc138361.aspx – okrumnow
原來,使用Reactive Extensions時,問題通過添加一個簡單的'DistinctUntilChanged'來解決。 – okrumnow