2012-01-18 46 views
0

對於以下數據集,我試圖選擇PARENT + CHILD + COUNT的組合,其中CREATED_DT是最大的。我假設GROUP BY是正確的方式來解決這個問題,但我沒有運氣。有什麼想法嗎?SQL:幫助使用GROUP BY(或其他?)選擇唯一PARENT + CHILD + MAX(CREATED_DT)記錄的COUNT

PARENT CHILD COUNT CREATED_DT  

PARENT1 CHILD1 100 01/17/2012 
PARENT1 CHILD1 200 01/16/2012 
PARENT1 CHILD2 300 01/14/2012 
PARENT1 CHILD2 400 01/15/2012 

期望的結果集的記錄1和4 - 即PARENT1 + CHILD1 + 100(1/17> 1/16),和PARENT1 + CHILD2 + 400(1/15> 1/14) 。

如果我做的:

SELECT PARENT, CHILD, COUNT, MAX(CREATED_DT) FROM TABLE 
GROUP BY PARENT, CHILD, COUNT 

...然後因爲計數不同的是,它還是選擇了所有4行。如果我嘗試:

SELECT PARENT, CHILD, MAX(CREATED_DT) FROM TABLE 
GROUP BY PARENT, CHILD 

...然後我不確定如何返回並獲取我現在丟失的COUNT。

想法?

回答

1

它可以幫助你嗎?

SELECT [PARENT], 
     [CHILD], 
     [COUNT], 
     [CREATED_DT] 
FROM (SELECT [PARENT], 
       [CHILD], 
       [COUNT], 
       [CREATED_DT], 
       Row_number() OVER (PARTITION BY [PARENT], [CHILD] ORDER BY 
       created_dt desc) 
         AS 
       'GroupId' 
     FROM t) a 
WHERE GroupId = 1 
+0

這是完美的 - 不知道我可以使用PARTITION BY做類似GROUP BY的事情,而不需要聚合。謝謝! – Mark 2012-01-18 20:11:17

2

是否這樣?

SELECT 
t1.PARENT 
, t1.CHILD 
, t1.COUNT 
, t1.CREATED_DT 
FROM TABLE t1 
WHERE 
t1.CREATED_DT = (SELECT MAX(t2.CREATED_DT) 
       FROM TABLE t2 
       WHERE t1.PARENT = t2.PARENT 
       AND t1.CHILD = t2.CHILD) 
+1

+1只注意,這可以返回每個組的多個結果(OP沒有提到)。 – harpo 2012-01-18 02:06:57

+0

我不願意提到我每組只需要1個結果的事實,所以我認爲PARTITION BY實際上最終會成爲這個特定用例的更好解決方案。無論如何,謝謝。 – Mark 2012-01-18 20:13:19