SQL Groupby UserID 取首尾重复

SQL Query Groupby UserID and take the first and last for duplicates

您好,我正在尝试对 table 上的某些元素进行 select。这是我的 table 的样子 Time、UsrerId、Data。现在我想做的是针对相同的用户 ID,我希望根据时间戳获得数据的第一个和最后一个值。

示例:

Time UserID Data 
8 PM 1 200 
9 PM 1 300 
10 PM 1 100 
8 PM 2 150 
9 PM 2 250 
10 PM 2 350 
8 PM 3 100 

所以我的结果应该是这样的:

1 200 100 
2 150 350 
3 100 100 

找到每个 userid

minmax 时间

然后 Join 主 table 的结果与 useridmin time 得到每个 userid[=24 的 min 数据=]

然后再次将结果与 main table 与 useridmax time 相结合,以获得每个 userid

max 数据

试试这个。

select A.UserID, A.Data as Min_data ,c.data as Max_data
from test A
join 
(
SELECT   UserID, MIN(Times) AS Min_Time,
  Max(Times) AS Max_Time
FROM     test
GROUP BY UserID
) B 
ON a.UserID = B.UserID
and A.times = B.Min_Time
join test C
ON C.UserID = B.UserID
and C.times = B.Max_Time

SqlFiddle Demo

这有几个步骤。

首先是找到每个userid的最早和最晚时间。你喜欢这样:

SELECT UserID,
       MIN(Time) startTime,
       MAX(Time) endTime
  FROM theTable
 GROUP BY UserID

然后,您需要使用该结果来获取与开始时间关联的数据。您可以像这样加入上面的摘要查询(虚拟 table)。

SELECT b.UserID,
       b.Data startData
  FROM (
          SELECT UserID,
                 MIN(Time) startTime,
                 MAX(Time) endTime
            FROM theTable
           GROUP BY UserID
       ) a
  JOIN theTable b ON a.UserID = b.UserID AND a.startTime = b.Time

最后,您需要以类似的方式处理最终值。

SELECT b.UserID,
       b.Data startData,
       c.Data endData
  FROM (
          SELECT UserID,
                 MIN(Time) startTime,
                 MAX(Time) endTime
            FROM theTable
           GROUP BY UserID
       ) a
  JOIN theTable b ON a.UserID = b.UserID AND a.startTime = b.Time
  JOIN theTable c ON a.UserID = c.UserID AND a.startTime = c.Time

这是一个有点棘手的查询,因为您必须连接 table 两次才能从中获取两个详细信息行(开始和结束时间行)。

构建查询的 "club sandwich" 方法应该有助于阐明其工作原理。