SQL group by problem

时间:2009-06-02 06:15:22

标签: sql mysql group-by

我有一个查询,它在WHERE子句中执行了许多连接并且有一些条件,我最终得到的结果基本上是这样的:

| userId |       date |  otherData |
|--------+------------+------------|
|      1 | 2008-01-01 |  different |
|      1 | 2009-01-01 |       info |
|      1 | 2010-01-01 |        for |
|      2 | 2008-01-01 |       each |
|      3 | 2008-01-01 |        row |
|      3 | 2009-01-01 |       here |

因此,对于每个用户而言,过去会有一个或多个日期,以及将来有0个或更多日期。

我需要以某种方式将数据集减少到每个用户一行,仅选择具有最近通过日期的行。也就是说,无论添加什么魔法GROUP BYHAVING子句,上面的结果都是这样的:

| userId |       date |  otherData |
|--------+------------+------------|
|      1 | 2009-01-01 |       info |
|      2 | 2008-01-01 |       each |
|      3 | 2009-01-01 |       here |

4 个答案:

答案 0 :(得分:5)

我认为您不想使用GROUP BY / HAVING,因为您对每个用户只有1行感兴趣,并且该行已经按原样存在于表中。这需要WHERE子句而不是GROUP BY / HAVING。

我的建议是在WHERE子句中添加一个条件,即日期必须等于子查询的结果。该子查询应该:

  1. 选择最大(日期)
  2. 有一个WHERE子句,将日期限制为小于NOW
  3. 拥有一个WHERE子句,其UserID等于外部查询的用户ID
  4. 为了防止某个用户可以拥有两个条目的日期也是最大“通过”日期的情况,您还应该添加DISTINCT。

    希望有所帮助。

答案 1 :(得分:0)

像这样:

select a.userId, a.date, b.userId, b.otherData
from table1 as a 
left outer join table2 as b on a.userId = b.userId
where b.Id in (
    select top 1 Id from table2 as c where c.userId = a.userId)

答案 2 :(得分:0)

Select 
  userID, date, otherData 
from 
  yourTable t1
where 
  date = 
    (select max(date) from yourTable t2
     where t1.userID=t2.userID)

答案 3 :(得分:0)

select T.userid, T.date, T.otherdata 
from 
    T, 
    (select userid, max(date) max_date from T group by userid) GT
where 
    T.userid = GT.userid and T.date = GT.max_date

说明: 内部选择 - 仅对每个用户的最大日期记录。 整个选择 - 用原始表连接izolated记录,以获取其他数据字段。

我假设用户ID只有一个最长日期。请说出这是否是正确的假设。