2013-03-25 69 views
0

我有三個表SQL集團通過最新的入門

table1  
PCName  PCID 
PC1  001 
PC2  002 
PC3  003 

table2 
PCID  LastOnline 
001  01.02.13 
002  05.01.13 
003  04.03.13 

table3 
PCID  PatchInstall 
001  03.02.13 
001  05.02.13 
001  01.02.13 
002  06.02.13 
002  08.02.13    
003  01.02.13 
003  09.02.13 
003  10.02.13 

I can get the information together like this 
PCID PCName LastOnline PatchInstall 
001  PC1  01.02.13 03.02.13 
001  PC1  01.02.13 05.02.13 
001  PC1  01.02.13 01.02.13 
002  PC2  05.01.13 06.02.13 
002  PC2  05.01.13 08.02.13    
003  PC3  04.03.13 01.02.13 
003  PC3  04.03.13 09.02.13 
003  PC3  04.03.13 10.02.13 

但我想只有對每個PC紀錄最近PatchInstall日期。我試圖用GROUP BY命令做,但沒有任何運氣。

有沒有人知道如何讓它成爲可能?

+1

哪些DBMS爲Y ou使用?甲骨文? Postgres的? – 2013-03-25 09:38:23

回答

2

試試這個:

SELECT 
    t1.pcid, 
    t2.name, 
    t2.LastOnLine, 
    t3.LatestPatchInstall 
FROM table1 AS t1 
INNER JOIN table2 AS t2 ON t1.pcid = t2.pcid 
INNER JOIN 
(
    SELECT pcid, MAX(PatchInstall) AS LatestPatchInstall 
    FROM table3 
    GROUP BY pcid 
) AS t3 ON t1.pcid = t3.pcid 
+0

感謝工作像一個魅力。我沒有測試其他選項,但感謝大家的意見。 – user2206898 2013-03-25 10:39:04

+0

@ user2206898 - 任何時候都歡迎您:)測試一下,如果出現任何問題,請不要猶豫再次提問:) – 2013-03-25 10:39:58

0

假設table1table2是在1對1的關係,這是因爲使用MAX功能簡單:

SELECT t1.PCID, PCName, LastOnline, MAX(PatchInstall) AS PatchInstall 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.PCID = t2.PCID 
LEFT OUTER JOIN table3 t3 ON t1.PCID = t3.PCID 
GROUP BY t1.PCID, PCName, LastOnline 

如果不是1對1的關係,你會得到每個table1 - table2一對一行。

0

嘗試:

SELECT 
    max(PatchInstall) over (partition by PCName) 
FROM YourTable 
0

這樣做的另一種更簡單的方法將使用CTEROW_NUMBER()

;WITH CTE AS 
(
    SELECT T1.PCName, 
      T2.LastOnline, 
      T3.PatchInstall, 
      ROW_NUMBER() OVER (PARTITION BY T1.PCID ORDER BY T3.PatchInstall DESC) AS RNK 
    FROM Table1 T1 
    INNER JOIN Table2 T2 ON T2.PCID = T1.PCID 
    INNER JOIN Table3 T3 ON T3.PCID = T1.PCID 
) 


SELECT * FROM CTE 
WHERE RNK = 1 

SQL FIDDLE DEMO