我有一张这样的表:
01-Jul-17 100
我想输出的是(按此顺序)通过消除连续重复而不是所有重复:
100个
300个
500个
300个
400个
100个
我无法选择Distinct,因为它将消除300,100的第二个实例。有没有办法在MySQL中实现这个结果? 谢谢!
答案 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;
<强>输出:强>
在这里演示:
答案 2 :(得分:0)
您可以使用滞后和引导功能。
select y from (select y , lag(y,1,0) over (order by x) as prev_y from t1) where y <> prev_y;