从数据库中选择不同的值

时间:2016-08-21 12:11:02

标签: sql database

我有一张表格如下:

ParentActivityID | ActivityID |时间戳

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

我想选择唯一的ParentActivityID以及Timestamp。时间戳可以是表中最新的时间戳或第一个时间戳。

我尝试使用DISTINCT,但我开始意识到它不会在单个列上工作。我是SQL的新手。在这方面的任何帮助将受到高度赞赏。

4 个答案:

答案 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