2016-06-23 51 views
0

我一直在閱讀關於SQL連接的大量答案,但我似乎無法找到解決此問題的任何內容。我有兩張表,我想加入。第一個(j_weather)是天氣數據。它包含一個日期時間字段(稱爲「有效」),每小時至少有一個條目,但通常不止一個。第二張表(j_collisions)包含交通事故警察記錄數據。它有一個日期和時間字段(稱爲'date_time'),它被格式化爲一個字符串(我沒有創建表)。不過,我已經能夠解決這個問題,使用子字符串函數(這在我下面的SQL查詢中很明顯)。這兩個日期/時間字段的格式「YYYY-MM-DD HH:SS」左連接:如何在重複時只使用連接左表中的一個值?

我想要的結果是交通碰撞對數據集中的每個小時數:

date_hour  | collisions 
-----------------|------------ 
2005-12-01 00:00 |  0 
2005-12-01 01:00 |  0 
2005-12-01 02:00 |  1 
2005-12-01 03:00 |  1 
2005-12-01 04:00 |  0 
2005-12-01 05:00 |  1 

如果沒有衝突那個小時,它應該返回一個零。我不能僅僅從j_collisions表中進行選擇,因爲分析期間的每個小時都沒有崩潰,並且我希望每個小時都顯示出來,即使它只顯示零崩潰。

這是我構建查詢:

select 
    format(w.valid, 'yyyy-MM-dd HH') + ':00' as date_hour, 
    count(c.master_file_number) as collisions 
from 
    hollings.dbo.j_weather as w 
left join 
    hollings.dbo.j_collisions as c 
on 
    format(w.valid, 'yyyy-MM-dd HH') = substring(c.date_time, 1, 13) 
group by 
    format(w.valid, 'yyyy-MM-dd HH') 
order by 
    date_hour 

然而,因爲正如我上面提到的,幾個小時對天氣的讀數多個記錄。因此,例如,如果2005-12-01的03:00有三次天氣讀數,我的結果將(錯誤地)讀取如下,而不是上述正確的預期結果。注意在03:00小時發生3次碰撞的結果,而不是正確的1次碰撞。

date_hour  | collisions 
-----------------|------------ 
2005-12-01 00:00 |  0 
2005-12-01 01:00 |  0 
2005-12-01 02:00 |  1 
2005-12-01 03:00 |  3 
2005-12-01 04:00 |  0 
2005-12-01 05:00 |  1 

我與SQL初學者,但我已經嘗試了許多選項,我能想到的/發現網上。如果我錯過任何細節,我會提前道歉,這是我第一次在這裏提問。任何幫助將不勝感激!

+0

嘗試尋找到一個聯合查詢。它消除了重複,並將你想要的特定數據合併到一個表中 – cdomination

回答

0

嘗試用count(distinct c.master_file_number)

select 
    format(w.valid, 'yyyy-MM-dd HH') + ':00' as date_hour, 
    count(distinct c.master_file_number) as collisions 
from 
    hollings.dbo.j_weather as w 
left join 
    hollings.dbo.j_collisions as c 
on 
    format(w.valid, 'yyyy-MM-dd HH') = substring(c.date_time, 1, 13) 
group by 
    format(w.valid, 'yyyy-MM-dd HH') 
order by 
    date_hour 
+0

如果在一個小時內有多個衝突有相同的數字,它可能會失敗 –

+0

@JatinPatel我認爲它是PK – vercelli

+0

在這種情況下,它可以按照需要工作,但在那裏沒有明確數據的唯一性。 –

0

嘗試......

SELECT * 
    FROM 
    ( select 
      format(w.valid, 'yyyy-MM-dd HH') + ':00' as date_hour, 
      count(c.master_file_number) as collisions, 
      ROW_NUMBER() OVER(PARTITION BY format(w.valid, 'yyyy-MM-dd HH') ORDER BY c.master_file_number) AS RowNo 
     from 
      hollings.dbo.j_weather as w 
     left join 
      hollings.dbo.j_collisions as c 
     on 
      format(w.valid, 'yyyy-MM-dd HH') = substring(c.date_time, 1, 13) 
     group by 
      format(w.valid, 'yyyy-MM-dd HH') 
    ) xx 
    where RowNo = 1 
    order by 
     date_hour