我有一个表格如下:从数据库中选择不同的值
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