【问题标题】:SQL ORDER BY before GROUP BYGROUP BY 之前的 SQL ORDER BY
【发布时间】:2016-12-06 08:11:36
【问题描述】:

这个问题之前已经被问过很多次了,但我的情况有点不同。

假设我有这些数据:

------------------------------
| id       | date            |
------------------------------
| 1        | 2016-07-15      |
| 1        | 2016-07-16      |
| 2        | 2016-07-24      |
| 2        | 2016-07-25      |
| 1        | 2016-07-29      |
| 1        | 2016-07-30      |
------------------------------

我想先按date 列排序,然后按id 列分组,并为每个idmax(date)

所以我会得到这个

------------------------------
| id       | max(date)       |
------------------------------
| 1        | 2016-07-16      |
| 2        | 2016-07-25      |
| 1        | 2016-07-30      |
------------------------------

注意id=1 出现了两次,因为顺序导致id=1 的2 个单独“组”,它们之间有一组id=2

我的意思是,我希望 group by 函数仅将具有相同值且由 order by 子句彼此相邻放置的行组合在一起。

我该怎么做?

【问题讨论】:

  • 允许的最大日期差异是多少,以便将这些日期放在一个组中?
  • @1000111 没有“差异限制”。关键是我只想将 idorder by 子句彼此相邻放置的相同行组合在一起
  • 你的表中没有主键吗?
  • 您的数据违反了first normal form(“行没有从上到下的顺序”),这是 SQL 所基于的关系模型的最基本要求。我想这会使使用 SQL 查询数据变得比应有的更加困难。

标签: mysql sql sql-order-by


【解决方案1】:

我认为你应该在这里使用变量。

select id, `date`
from (
    select 
        id, 
        `date`, 
        @rowno := case when @grp = id then @rowno + 1 else 0 end as rowno,
        @grp := id
    from (
        select *
        from yourtable
        order by `date` desc
    ) t1
    cross join (select @grp := null, @rowno = 0) t2
) main
where main.rowno = 0
order by `date`;

内部查询会这样组织记录,

---------------------------------------------
| id       | date            | rowno | @grp |
---------------------------------------------
| 1        | 2016-07-30      | 0     | 1    |
| 1        | 2016-07-29      | 1     | 1    |
| 2        | 2016-07-25      | 0     | 2    |
| 2        | 2016-07-24      | 1     | 2    |
| 1        | 2016-07-16      | 0     | 1    |
| 1        | 2016-07-15      | 1     | 1    |
---------------------------------------------

然后一个 where 子句 rowno = 0 会得到你想要的。

SQLFiddle Demo

【讨论】:

  • 这将返回每个 id 的第一个日期而不是最后一个日期。
  • 这看起来很聪明,在main 中没有ORDER BY 的订单是否有保证?
  • @P.Salmon 我已经测试过了,你也可以在 sqlfiddle 中运行这个查询,但它似乎失败了。
  • @mendosi 没有order by,订单将无法保证。 :-)
  • 更多详情请参见mysqltutorial.org/mysql-row_number
猜你喜欢
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2014-08-31
  • 2019-01-21
  • 2021-11-03
相关资源
最近更新 更多