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

时间:2017-07-25 01:17:35

标签: mysql sql

我有一张这样的表:

01-Jul-17 100
02-Jul-17 100
03-Jul-17 300
04-Jul-17 300
05-Jul-17 500
06-Jul-17 500
07-Jul-17 300
08-Jul-17 400
09年7月17日100
10-Jul-17 100


我想输出的是(按此顺序)通过消除连续重复而不是所有重复:
100个
300个
500个
300个
400个
100个

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

3 个答案:

答案 0 :(得分:0)

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

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中表达式的评估顺序。因此,变量不应该在一个表达式中赋值,然后在另一个表达式中使用 - 它们应该在一个表达式中赋值。

答案 1 :(得分:0)

解决此问题的一种方法是使用会话变量来跟踪日期列所排序的值的更改。在下面的查询中,我们跟踪按日期排序的值,并为每个具有相同值的组分配行号。然后,仅保留每个组中的第一个值。请注意,此方法对任意数量的重复都很稳健。只要每个记录可以按日期排序,它在您的日期中存在差距方面也很稳健。

SET @rn = 1;
SET @val = NULL;

SELECT t.val
FROM
(
    SELECT
        @rn:=CASE WHEN @val = val THEN @rn+1 ELSE 1 END rn,
        @val:=val AS val,
        dt
    FROM yourTable
    ORDER BY dt
) t
WHERE t.rn = 1
ORDER BY t.dt;

<强>输出:

enter image description here

在这里演示:

Rextester

答案 2 :(得分:0)

您可以使用滞后和引导功能。

select y from (select y , lag(y,1,0) over (order by x) as prev_y from t1) where y <> prev_y;