SQL Query Group By UserID,取第一个和最后一个重复项

时间:2015-02-18 01:34:12

标签: mysql sql sqlite hql

您好我正在尝试在表格上选择某些元素。这是我的表看起来像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 

2 个答案:

答案 0 :(得分:2)

根据min

查找maxuserid时间

然后Join主表与useridmin time的结果,以获得每min的{​​{1}}个数据

然后再次将结果与主表格useriduserid结合,以获得每max time

max数据

试试这个。

userid

<强> SqlFiddle Demo

答案 1 :(得分:1)

这有几个步骤。

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

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

然后,您需要使用该结果来获取与开始时间关联的数据。您可以通过加入上述摘要查询(虚拟表)来实现这一点。

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

这是一个稍微棘手的查询,因为您必须将表连接两次以从中获取两个详细信息行(开始和结束时间行)。

建立查询的“俱乐部三明治”方法应该有助于明确其工作原理。