2011-11-17 30 views
2

有參與這一問題2個表:SQL查詢 - 具有多個表的分組

表1:

|- Time Stamp -|- Special Number -|- Other Data -| 
|- 2011  -|- 1    -|- green  -| 
|- 2010  -|- 1    -|- blue  -| 
|- 2009  -|- 2    -|- yellow  -| 
|- 2011  -|- 3    -|- red  -| 
|- 2010  -|- 3    -|- orange  -| 
|- 2009  -|- 4    -|- purple  -| 

表2:

|- Special Number -|- State (location) -| 
|- 1    -|- Hawaii   -| 
|- 2    -|- Hawaii   -| 
|- 3    -|- Alaska   -| 
|- 4    -|- Alaska   -| 

表2涉及的 '特別號碼'到'國家'

現在,然後,我想要得到的結果看起來像這樣:

|- Time Stamp -|- State (location) -|- Other Data -| 
|- 2011  -|- Hawaii   -|- green  -| 
|- 2011  -|- Alaska   -|- red  -| 

當我試圖讓MAX時間戳,每個國家,以及從表1

對應於「最新時間戳」行如果我做的其他數據分組:

SELECT MAX(time stamp), state 
FROM table 1, table 2 
WHERE table 1.special number = table 2.special number 
GROUP BY state 

這將返回最大時間戳,每個狀態(這幾乎是我所期待的),但是當我嘗試包括「其他數據」,它返回所有記錄(因爲每一個「其它數據'記錄是獨一無二的)。

我希望有人能提供一些思路, 感謝

編輯:

表1有一個唯一的ID列:

|- Time Stamp -|- Special Number -|- Other Data -|- Unique Row ID -| 
|- 2011  -|- 1    -|- green  -| 0    -| 
|- 2010  -|- 1    -|- blue  -| 1    -| 
|- 2009  -|- 2    -|- yellow  -| 2    -| 
|- 2011  -|- 3    -|- red  -| 3    -| 
|- 2010  -|- 3    -|- orange  -| 4    -| 
|- 2009  -|- 4    -|- purple  -| 5    -| 

編輯2:解決方案* * * *謝謝大家誰發佈! * * * *

SELECT t1.timestamp, t2.specialNumber, t1.otherData 
FROM Table1 t1 inner join Table2 t2 on t1.specialNumber = t2.specialNumber 
    inner join (select MAX(Table1.timestamp) maxts, Table2.state 
     from Table1 inner join Table2 on Table1.specialNumber = Table2.specialNumber 
     group by Table2.state) t3 
    on t2.state = t3.state and t1.timestamp = t3.maxts 

*咻*

+0

您是否有ID列來唯一標識表1中的行? – geekchic

+0

在這裏搜索「sql latest row」,你應該可以找到幾種方法 –

+0

我有一個ID列來唯一標識表1中的一行,我將發佈一個編輯後的表格1 – SimpleSam5

回答

3

唉唉,歷久彌新 ...

這裏有一個辦法做到這一點:

SELECT t1.TimeStamp, t2.State, t1.OtherData 
FROM Table1 t1 
inner join Table2 t2 
    on t1.SpecialNumber = t2.SpecialNumber 
inner join (SELECT MAX(time stamp) maxts, state 
      FROM table1 inner join table2 
      ON table1.specialnumber = table2.specialnumber 
      GROUP BY state) t3 
    on t2.State = t3.State and t1.TimeStamp = t3.maxts 

有一個非常全面的回答這裏:SQL Select only rows with Max Value on a Column

+0

您錯過了派生表中的別名maxts。 – Kash

+0

@Kash是的,我做到了。感謝您的支持,它已經修復! –

+0

謝謝,這足夠接近我的解決方案!我會盡快發佈。 – SimpleSam5

0

你可以讓你的查詢變成一個子查詢在我的版本中),然後再次加入到table1中,並獲取額外的列,如下所示:

SELECT * FROM 

(SELECT MAX(time stamp), state 
FROM table 1, table 2 
WHERE table 1.special number = table 2.special number 
GROUP BY state) states 

LEFT JOIN table1 t1_again 
ON states.specialNumber = t1_again.specialNumber 
+0

在派生表「州」中沒有'specialNumber' ... –

+0

除了Adrian對specialNumber的評論,此代碼在表名和列名中不一致。 MAX函數的列沒有別名。 – Kash

+0

我的文章不是作爲文字代碼,而是作爲你如何解決這個問題的例子。很明顯,像「特殊號碼」這樣的列名稱並不真正起作用,但是要感謝您指出了這些顯而易見的內容。 – pseudopeach