5

我有一个查询,它执行了许多连接,并且在 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 个或多个日期。

我需要以某种方式将数据集减少到每个用户一行,只选择最近通过的行 date。也就是说,无论添加什么魔法GROUP BYHAVING子句,上面的结果将如下所示:

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

4 回答 4

5

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

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

  1. 选择最大值(日期)
  2. 有一个 WHERE 子句将日期限制为小于 NOW
  3. 有一个用户 ID 等于外部查询的用户 ID 的 WHERE 子句

为了防止某个用户可以有两个条目具有相同的日期,这也是最大“通过”日期,您还应该添加 DISTINCT。

希望有帮助。

于 2009-06-02T06:23:53.023 回答
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)
于 2009-06-02T06:29:49.143 回答
0
选择
  用户 ID、日期、其他数据
从
  你的表 t1
在哪里
  日期 =
    (从 yourTable t2 中选择 max(date)
     其中 t1.userID=t2.userID)
于 2009-06-02T06:30:51.997 回答
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 记录与原始表连接,以获取 otherdata 字段。

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

于 2009-06-02T06:31:21.637 回答