我有一个查询,它在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 BY
或HAVING
子句,上面的结果都是这样的:
| userId | date | otherData |
|--------+------------+------------|
| 1 | 2009-01-01 | info |
| 2 | 2008-01-01 | each |
| 3 | 2009-01-01 | here |
答案 0 :(得分:5)
我认为您不想使用GROUP BY / HAVING,因为您对每个用户只有1行感兴趣,并且该行已经按原样存在于表中。这需要WHERE子句而不是GROUP BY / HAVING。
我的建议是在WHERE子句中添加一个条件,即日期必须等于子查询的结果。该子查询应该:
为了防止某个用户可以拥有两个条目的日期也是最大“通过”日期的情况,您还应该添加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只有一个最长日期。请说出这是否是正确的假设。