我有一张表格如下:
ParentActivityID | ActivityID |时间戳
1 A1 T1
2 A2 T2
1 A1 T1
1 A1 T5
我想选择唯一的ParentActivityID以及Timestamp。时间戳可以是表中最新的时间戳或第一个时间戳。
我尝试使用DISTINCT,但我开始意识到它不会在单个列上工作。我是SQL的新手。在这方面的任何帮助将受到高度赞赏。
答案 0 :(得分:0)
DISTINCT
是一种适用于单个列的简写。如果您有多列,请使用GROUP BY
:
SELECT ParentActivityID, Timestamp
FROM MyTable
GROUP BY ParentActivityID, Timestamp
实际上我只想要一个ParentActivityID。您的解决方案将为每对ParentActivityID和Timestamp提供。例如,如果我有[1,T1],[2,T2],[1,T3],那么我想要的值为[1,T3]和[2,T2]。
您需要确定要选择的众多时间戳中的哪一个。如果您想要最早的,请使用MIN
:
SELECT ParentActivityID, MIN(Timestamp)
FROM MyTable
GROUP BY ParentActivityID
答案 1 :(得分: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()
聚合函数来解决此问题。
答案 2 :(得分:0)
试试这个:
SELECT [ParentActivityId],
MIN([Timestamp]) AS [FirstTimestamp],
MAX([Timestamp]) AS [RecentTimestamp]
FROM [Table]
GROUP BY [ParentActivityId]
这将为您提供表中存在的每个ParentActivityId的第一个时间戳和最新时间戳。您可以根据需要选择所需的那些。
答案 3 :(得分: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