2013-03-25 65 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