2016-08-21 118 views
0

我有一個表格如下:從數據庫中選擇不同的值

ParentActivityID | ActivityID |時間戳

1    A1   T1 
2    A2   T2 
1    A1   T1 
1    A1   T5 

我想選擇唯一的ParentActivityID與Timestamp一起。時間戳可以是最近的一個,也可以是表中出現的第一個。

我試圖使用DISTINCT,但我意識到它不適用於單個列。我是SQL新手。任何在這方面的幫助將不勝感激。

回答

0

DISTINCT是適用於單列的簡寫。當你有多個列,用GROUP BY

SELECT ParentActivityID, Timestamp 
FROM MyTable 
GROUP BY ParentActivityID, Timestamp 

其實我只想要一個一個ParentActivityID。您的解決方案將給每對ParentActivityID和時間戳。例如,如果我有[1,T1],[2,T2],[1,T3],那麼我需要的值爲[1,T3]和[2,T2]。

您需要決定選擇多少個時間戳。如果你想最早的企業之一,使用MIN

SELECT ParentActivityID, MIN(Timestamp) 
FROM MyTable 
GROUP BY ParentActivityID 
+0

感謝您的回覆。其實我只想要一個ParentActivityID。您的解決方案將給每對ParentActivityID和時間戳。 For e。g,如果我有[1,T1],[2,T2],[1,T3],那麼我希望該值爲[1,T3]和[2,T2]。 – Varun

0

「集團通過」是什麼您這裏需要。只要做到「組由ParentActivityID」,並告訴大家,最近的時間戳一起是需要你用相同的ParentActivityID所有行:「按組」

SELECT ParentActivityID, MAX(Timestamp) FROM Table GROUP BY ParentActivityID 

操作就像從表中取行,把它們放在地圖在group by子句中定義的一個鍵(本例中爲ParentActivityID)。你必須定義如何分組將通過重複鍵來處理行。爲此,您可以使用各種集合函數,您可以在要選擇的列上指定但不是鍵的一部分(未在group by子句中列出,將它們視爲地圖中的值)。

某些數據庫(如mysql)還允許您選擇不屬於group by子句(不在鍵中)的列,而無需對其應用集合函數。在這種情況下,你會得到這個列的一些隨機值(這就像每次盲目地覆蓋地圖中的值並賦新值)。儘管如此,SQL標準以及大多數數據庫不會允許你這樣做。在這種情況下,您可以使用min(),max(),first()last()集合函數來解決此問題。

0

試試這個:

SELECT [ParentActivityId], 
     MIN([Timestamp]) AS [FirstTimestamp], 
     MAX([Timestamp]) AS [RecentTimestamp] 
FROM [Table] 
GROUP BY [ParentActivityId] 

這將爲您提供第一時間標記和最近的每個ParentActivityId時間戳出現在表格中。你可以根據你的需要選擇你需要的。

0

使用CTE根據父ID從表中獲取最新的行,並且可以從輸出的整行中選擇列。

;With cte_parent 
As 
    (SELECT ParentActivityId,ActivityId,TimeStamp 
      , ROW_NUMBER() OVER(PARTITION BY ParentActivityId ORDER BY TimeStamp desc) RNO 
    FROM YourTable) 

SELECT * 
FROM cte_parent 
WHERE RNO =1