【问题标题】:SQL group by problemSQL 按问题分组
【发布时间】:2010-10-30 14:26:34
【问题描述】:

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

【问题讨论】:

    标签: sql mysql group-by


    【解决方案1】:

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

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

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

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

    希望对您有所帮助。

    【讨论】:

    • 工作正常!!但添加 DISTINCT 不会删除重复值,有什么建议吗?
    【解决方案2】:
    选择 用户 ID、日期、其他数据 从 你的表 t1 在哪里 日期 = (从 yourTable t2 中选择 max(date) 其中 t1.userID=t2.userID)

    【讨论】:

      【解决方案3】:
      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 只有一个最大日期。请说出这是不是正确的假设。

      【讨论】:

        【解决方案4】:

        像这样:

        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)
        

        【讨论】:

          猜你喜欢
          • 2012-02-19
          • 2011-06-20
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 2010-10-10
          • 2020-12-05
          • 2011-09-08
          • 2014-12-26
          相关资源
          最近更新 更多