我有一個表格如下:從數據庫中選擇不同的值
ParentActivityID | ActivityID |時間戳
1 A1 T1
2 A2 T2
1 A1 T1
1 A1 T5
我想選擇唯一的ParentActivityID與Timestamp一起。時間戳可以是最近的一個,也可以是表中出現的第一個。
我試圖使用DISTINCT,但我意識到它不適用於單個列。我是SQL新手。任何在這方面的幫助將不勝感激。
我有一個表格如下:從數據庫中選擇不同的值
ParentActivityID | ActivityID |時間戳
1 A1 T1
2 A2 T2
1 A1 T1
1 A1 T5
我想選擇唯一的ParentActivityID與Timestamp一起。時間戳可以是最近的一個,也可以是表中出現的第一個。
我試圖使用DISTINCT,但我意識到它不適用於單個列。我是SQL新手。任何在這方面的幫助將不勝感激。
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
「集團通過」是什麼您這裏需要。只要做到「組由ParentActivityID」,並告訴大家,最近的時間戳一起是需要你用相同的ParentActivityID所有行:「按組」
SELECT ParentActivityID, MAX(Timestamp) FROM Table GROUP BY ParentActivityID
操作就像從表中取行,把它們放在地圖在group by子句中定義的一個鍵(本例中爲ParentActivityID)。你必須定義如何分組將通過重複鍵來處理行。爲此,您可以使用各種集合函數,您可以在要選擇的列上指定但不是鍵的一部分(未在group by子句中列出,將它們視爲地圖中的值)。
某些數據庫(如mysql)還允許您選擇不屬於group by子句(不在鍵中)的列,而無需對其應用集合函數。在這種情況下,你會得到這個列的一些隨機值(這就像每次盲目地覆蓋地圖中的值並賦新值)。儘管如此,SQL標準以及大多數數據庫不會允許你這樣做。在這種情況下,您可以使用min()
,max()
,first()
或last()
集合函數來解決此問題。
試試這個:
SELECT [ParentActivityId],
MIN([Timestamp]) AS [FirstTimestamp],
MAX([Timestamp]) AS [RecentTimestamp]
FROM [Table]
GROUP BY [ParentActivityId]
這將爲您提供第一時間標記和最近的每個ParentActivityId時間戳出現在表格中。你可以根據你的需要選擇你需要的。
使用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
感謝您的回覆。其實我只想要一個ParentActivityID。您的解決方案將給每對ParentActivityID和時間戳。 For e。g,如果我有[1,T1],[2,T2],[1,T3],那麼我希望該值爲[1,T3]和[2,T2]。 – Varun