一尘不染

如何在选择查询(MySQL)中仅消除连续重复项而不消除所有重复项?

sql

我有一个这样的表:

17年7月1日100年
7月2日100年
3月7日100年17年7月300
17年7月4日300年
7月5日500年
7月5日500年7月7日听500年
7月7日听300年
8月7日听700年17年7月
9日听100
17年7月10日听100

我想输出是(按顺序)通过消除重复的连续但不是全部重复:
100
300
500
300
400
100

我无法选择Distinct,因为它将消除300、100的第二个实例。在MySQL中有没有办法实现此结果?谢谢!


阅读 187

收藏
2021-03-08

共1个答案

一尘不染

您想要获得先前的值。如果日期确实没有间隔或重复,请执行以下操作:

select t.*
from t left join
     t tprev
     on t.col1 = date_add(tprev.col1, interval 1 day)
where tprev.col2 is null or tprev.col2 <> t.col2;

编辑:

如果日期不满足这些条件,则可以使用变量:

select t.*
from (select t.*,
             (@rn := if(@v = col2, @rn + 1,
                        if(@v := col2, 1, 1)
                       )
             ) as rn
      from t cross join
           (select @v := 0, @rn := 0) params
      order by t.col1
     ) t
where rn = 1;

请注意,MySQL不保证中的表达式求值顺序SELECT。因此,不应在一个表达式中分配变量,而后在另一个表达式中使用变量-应该在单个表达式中分配变量。

2021-03-08