2013-06-03 33 views
0

在本例中,我正在收集汽車上的一些引擎數據。MSSQL多列累計時間查詢

Variables 
-------------------------------------- 
id | name 
-------------------------------------- 
1  Headlights On 
2  Tire Pressure 
3  Speed 
4  Engine Runtime in Seconds 
... 


Values 
-------------------------------------- 
id | var_id | value | time 
-------------------------------------- 
1  1   1  2013-05-28 16:42:00.100 
2  1   0  2013-05-28 16:42:22.150 
3  2   32.0 2013-05-28 16:42:22.153 
4  3   65  2013-05-28 16:42:22.155 
... 

我想寫一個返回設置像下面這樣的結果的查詢:

Input: 1,2,3 


Time    | Headlights On | Tire Pressure | Speed 
--------------------------------------------------------------- 
2013-05-28 16:42:00 1         
2013-05-28 16:42:22 0    32    65 

能夠修改查詢以只包括一組給定的變量,並在指定的結果間隔說(1秒,1分鐘或5分鐘)對我的用例也非常重要。

如何在T-SQL中編寫一個查詢,該查詢將返回按特定間隔時間聚合的多列結果集?

+0

對正在返回「按特定間隔時間聚合的多列結果集」的查詢進行糾正不成問題。編寫具有可變列名稱*的查詢是一個問題。做你想做的事情需要動態SQL,因爲列名存儲在一個單獨的表中。這真的是一個要求嗎? –

+0

想通了。我可以使用客戶端應用程序從結果集中生成一個多列表,但我不想去那裏,因爲我還沒有開始處理客戶端應用程序。試圖在測試我的小OBD閱讀器設備時,更好地理解數據庫中的內容。 –

回答

1

1分鐘骨料:

SELECT {edit: aggregate functions over fields here} FROM Values WHERE {blah} GROUP BY DATEPART (minute, time); 

5分鐘骨料:

SELECT {edit: aggregate functions over fields here} FROM Values WHERE {blah} GROUP BY 
    DATEPART(YEAR, time), 
    DATEPART(MONTH, time), 
    DATEPART(DAY, time), 
    DATEPART(HOUR, time), 
    (DATEPART(MINUTE, time)/5); 

由於這個原因,後面的部分如此纏繞,請看這裏SO帖子:How to group time by hour or by 10 minutes

編輯1: 對於部分「包括只產生一組給定的變量」,我的理解是,要與var_id是一組指定的中隔離值。如果您可以依賴不變的數字/含義,常用的SQL解決方案是IN關鍵字(http://msdn.microsoft.com/en-us/library/ms177682.aspx)。

這就是你要放在上面的WHERE子句中的例子,

... WHERE var_id IN (2, 4) ... 

如果你不能依靠知道變量的數字,但有一定的瞭解他們的名字,可以更換一個子查詢的設置,如:

... WHERE var_id IN (SELECT id FROM Variables WHERE name IN ('Tire Pressure','Headlights On')) ... 

的另一種解釋是,您實際上也希望基於變量ids進行聚合。在這種情況下,你必須在你的GROUP BY子句中包含var_id。

爲了使結果更像交叉表,我想你會想按照你使用的時間聚合進行排序。希望幫助更多。

+0

這告訴我如何設置一個時間間隔,這要感謝帖子中的鏈接。這很有幫助。不過,我仍然不知道如何在我的問題中設置類似於交叉表的結果集。這不像「WHERE {blah}」那麼簡單,我想。 –

+1

也許我的編輯會有所幫助。儘管如此,我仍然不確定我對你要找的東西的解釋是否正確。 –

+0

這讓我朝着正確的方向前進。仍在學習MSSQL。這個SQL查詢給我一個錯誤。由於我們按時間分組,所以'SELECT *'將產生'不包含在聚合函數中'的錯誤。事情是,我不想包含它... max(),min()等在這裏不相關 - 我只是想要那個行的實際值。 –

1

嘗試

SELECT 
    VehicleID 
    , Case WHEN Name = 'Headlights on' THEN 1 
    Else 0 END ' as [Headlights on] 
    , Case WHEN Name = 'Tyre pressure' THEN Value 
    Else CAST(NULL AS REAL) END ' as [Tyre pressure] 
, DateName(Year, DateField) [year ] 
FROM 
    Table 

ETC

然後agrregate根據需要

SELECT 
     VehicleID 
     , SUM([Headlights on]) SUM([Headlights on], 
FROM 
(
QUery above 

) S 
GROUP BY 
VehicleID 
, [Year] 
+0

這種給我提供了一些線索,但並不真正在尋找什麼。在我的例子中查看錶格,我記錄了一組變量的值。我不想總結一段時間內Headlights_On的真實性,我想在一段時間間隔內以交叉表格的形式顯示提供的一組變量的值。 –

+0

那麼有很多agregate函數,如果你想要1的地方它的真(甚至多次),那麼只需使用MAX(binary_column)或MAX(NumericColumnEgTyrePressure)。如果你按(VEhicleId和TimePeriod)分組,那麼這正是你所要求的,因爲我理解你的問題 –