2016-07-26 62 views
0

我有兩個表命名的字符串和浮動計數行上JOIN

String 
|    DateAndTime   | Val | 
--------------------------------------------- 
|  2016-07-26 18:35:31.000  | AX2 | 
|  2016-07-26 18:30:31.000  | G27 | 
|  2016-07-26 18:25:31.000  | AX2 | 
|  2016-07-26 18:20:31.000  | AX2 | 
|  2016-07-26 18:20:31.000  | G27 | 

Float 
|    DateAndTime   | Val | Marker | 
------------------------------------------------------ 
|  2016-07-26 18:31:31.000  | 234 | X | 
|  2016-07-26 18:26:31.000  | 612 | y | 
|  2016-07-26 18:21:31.000  | 12 | a | 
|  2016-07-26 18:21:31.000  | 123 | f | 

從這兩個表我想從字符串表中的每個Val已經發生在最小和最大日期過去24小時並顯示該信息。我也想計算插入到每個Val的最小和最大時間之間的浮動表中的每一行,並將其顯示在一邊。

以下是我的查詢。查詢StringTable的部分工作得很好,我得到了我期望的結果。然後我試着在Float表上做一個JOIN並計算行數。

SELECT 
    S.Batch, 
    COUNT(F.DateAndTime) AS DataPointsRecorded, 
    S.CycleStart, 
    S.LastRecordedTime 
FROM 
    (
     SELECT DISTINCT 
       Val AS Batch, 
       MIN(DateAndTime) AS CycleStart, 
       MAX(DateAndTime) AS LastRecordedTime 
     FROM  dbo.StringTable 
     WHERE DATEDIFF(HOUR,DateAndTime, GETDATE()) < 24 
     AND  Val IS NOT NULL 
     GROUP BY Val 
    ) S 
JOIN  dbo.FloatTable F ON S.CycleStart = F.DateAndTime 
GROUP BY S.Batch, S.CycleStart, S.LastRecordedTime 
ORDER BY CycleStart desc, Batch 

這導致每個DataPointsRecorded出現爲每行相同的確切數字。

然後我改變了我如何使用

JOIN dbo.FloatTable F ON F.DateAndTime BETWEEN S.CycleStart AND S.LastRecordedTime

加入了兩個表,並只是導致各行的數據點在非常大的數字。

我的預期結果就像我之前給出的例子那樣。

| Batch | DataPoint |   CycleStart   |    LastRecordedTime  | 
----------------------------------------------------------------------------------------------- 
| AX2 |  4  | 2016-07-26 18:20:31.000  |  2016-07-26 18:35:31.000  | 
| G27 |  3  | 2016-07-26 18:20:31.000  |  2016-07-26 18:30:31.000  | 

回答

1

試試這個(我用2列CycleStart,LastRecordedTime的刪除了論壇)

SELECT 
    S.Batch, 
    COUNT(F.DateAndTime) AS DataPointsRecorded, 
    Min(S.CycleStart) as CycleStart , 
    Max(S.LastRecordedTime) as LastRecordedTime 
FROM 
    (
     SELECT DISTINCT 
       Val AS Batch, 
       MIN(DateAndTime) AS CycleStart, 
       MAX(DateAndTime) AS LastRecordedTime 
     FROM  dbo.StringTable 
     WHERE DATEDIFF(HOUR,DateAndTime, GETDATE()) < 24 
     AND  Val IS NOT NULL 
     GROUP BY Val 
    ) S 
JOIN  dbo.FloatTable F ON F.DateAndTime BETWEEN S.CycleStart AND S.LastRecordedTime 
GROUP BY S.Batch -- S.CycleStart -- S.LastRecordedTime Commented out the last 2 
ORDER BY CycleStart desc, Batch 

編輯: 說明

爲什麼你看到的更多的數據的原因,你的查詢是因爲你在更細粒度的級別上進行聚合,包括時間戳,這些時間戳強制sql包括批次+ CycleStart + LastRecordedTime的所有獨特組合

+0

我收回了我的評論,抱歉的混淆。我所在的測試數據庫有一些破損的數據。你的回答確實有助於獲得我期望的結果。謝謝。 – Timmy