【问题标题】:Group rows with the same value only if they are one after the other in MySQL只有当它们在 MySQL 中一个接一个时才对具有相同值的行进行分组
【发布时间】:2015-08-27 20:21:34
【问题描述】:

我想实现与此非常相似但使用 MySQL 的东西:

Group rows if certain column value directly after another in SQL

但是,在我的情况下,id 没有增加 1,但存在随机间隙,例如:

0 -- bob -- note -- 14:00
3 -- bob -- note -- 15:00
9 -- bob -- time -- 15:00
20 - bob -- note -- 15:00

I need to display:
0 -- bob -- note -- 14:00
9 -- bob -- time -- 15:00
20 - bob -- note -- 15:00

任何帮助将不胜感激:)

【问题讨论】:

  • 省略3 -- bob -- note -- 15:00背后的逻辑是什么?
  • 我没有省略,我只是想将它们分组为一个记录,如果它们相继出现。
  • 不,你省略了。您似乎保留了“第 1 列”值最低的那个

标签: mysql


【解决方案1】:
select id,  Name,  Event,  Time 
  from (select *, @e prev, @e:=Event 
          from table, (select @e:='') e) t 
  where prev<>Event

Demo on sqlfiddle

【讨论】:

  • 希望看到明确使用CROSS JOIN,并且不应该初始化@e 使用单引号? sqlfiddle.com/#!9/cc3a0/2
  • @Used_By_Already OK 关于报价。你能用两个词说一下这里使用交叉连接的区别吗?
  • @splash58 非常感谢这两个都有效!请您解释一下查询的这一部分:select *, @e prev, @e:=Event from table, (select @e:='') e 因为语法对我来说是新的。我得出的结论是 (select @e:='') 用于初始化变量 e 但它怎么知道它应该通过 @e prev 获取上一条记录是 sql 关键字?
  • @sc1234 @e prev 使用以前的值创建字段,@e:=Event 使用当前事件更改 e 变量以进行下一步
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多