2009-07-27 59 views
3

想象一下下面的架構和樣本數據(SQL Server 2008中):變體使用GROUP BY子句中TSQL

OriginatingObject 
---------------------------------------------- 
ID 
1 
2 
3 

ValueSet 
---------------------------------------------- 
ID OriginatingObjectID DateStamp 
1 1      2009-05-21 10:41:43 
2 1      2009-05-22 12:11:51 
3 1      2009-05-22 12:13:25 
4 2      2009-05-21 10:42:40 
5 2      2009-05-20 02:21:34 
6 1      2009-05-21 23:41:43 
7 3      2009-05-26 14:56:01 

Value 
---------------------------------------------- 
ID ValueSetID Value 
1 1   28 
etc (a set of rows for each related ValueSet) 

我需要獲得最新的ValueSet記錄每個OriginatingObject的ID。不要認爲記錄的ID越高,越新。

我不知道如何正確使用GROUP BY,以確保組合在一起以形成每個聚合行的結果集包括具有該分組的最高DateStamp值的行的ID。我需要使用子查詢還是有更好的方法?

+0

澄清:你想爲每個OriginatingObjectID最近的ValueSet.ID? – Benjol 2009-07-27 11:34:18

+0

Benjol:對。 – 2009-07-27 11:36:14

回答

4

您可以使用相關子查詢或IN使用多列和GROUP BY。

請注意,簡單的GROUP-BY只能將您帶入OriginatingIDs和時間戳列表。爲了拉取相關的ValueSet ID,最乾淨的解決方案是使用子查詢。

多列在GROUP-BY(可能更快):

SELECT O.ID, V.ID 
FROM Originating AS O, ValueSet AS V 
WHERE O.ID = V.OriginatingID 
AND 
(V.OriginatingID, V.DateStamp) IN 
(
    SELECT OriginatingID, Max(DateStamp) 
    FROM ValueSet 
    GROUP BY OriginatingID 
) 

相關子查詢:

SELECT O.ID, V.ID 
FROM Originating AS O, ValueSet AS V 
WHERE O.ID = V.OriginatingID 
AND 
V.DateStamp = 
(
    SELECT Max(DateStamp) 
    FROM ValueSet V2 
    WHERE V2.OriginatingID = O.ID 
) 
+0

注意,如果您有兩個最近的ValueSet具有完全相同的時間戳(但這可能是所需的行爲),則這可能會返回重複的ViewSet。 – 2009-07-27 11:41:36

+1

......如果不是,Max(V.ID)和extra組將會足夠。 – Benjol 2009-07-27 11:42:32

1
SELECT OriginatingObjectID, id 
FROM (
    SELECT id, OriginatingObjectID, RANK() OVER(PARTITION BY OriginatingObjectID 
            ORDER BY DateStamp DESC) as ranking 
    FROM ValueSet) 
WHERE ranking = 1; 
0

這可以用相關子查詢來完成。不需要GROUP-BY。

SELECT 
    vs.ID, 
    vs.OriginatingObjectID, 
    vs.DateStamp, 
    v.Value 
FROM 
    ValueSet vs 
    INNER JOIN Value v ON v.ValueSetID = vs.ID 
WHERE 
    NOT EXISTS (
    SELECT 1 
    FROM ValueSet 
    WHERE OriginatingObjectID = vs.OriginatingObjectID 
      AND DateStamp > vs.DateStamp 
) 

只有當ValueSet表中的OriginatingObjectID不能有兩個相等的DateStamps時,這纔有效。