2016-08-21 107 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