我有一个像这样的tabe:
sn(char) ts(int) data(char) flag(tinyint)
'a' 1494825611 'a0' 1
'a' 1494825613 'a1' 0
'a' 1494825617 'a2' 0
'a' 1494825623 'a3' 1
'a' 1494825634 'a4' 1
'b' 1494825644 'b1' 1
'b' 1494825643 'b0' 0
'a' 1494825645 'a5' 1
'a' 1494825648 'a6' 0
'b' 1494825658 'b2' 1
行的顺序可能不正确(例如b1
和b0
),因此首先应按ts
排序。
我正在尝试对sn
进行有效查询,以获取当前和下一个flag
不同的行。
因此,对sn
'a':
old_ts ts old_data data flag
1494825611 1494825613 'a0' 'a1' 0
1494825617 1494825623 'a2' 'a3' 1
1494825645 1494825648 'a5' 'a6' 0
和sn
'b':
old_ts ts old_data data flag
1494825643 1494825644 'b0', 'b1' 1
创建其他列或表不是问题。
答案 0 :(得分:2)
您可以使用@rowFlag
变量。每行检查它是否等于标志。如果是,则将过滤器字段设置为0以稍后跳过
select old_ts, ts, old_data, data, new_flag as flag
from
(select
t.ts,
t.data,
case when @rowFlag=flag then 0 else 1 end as filter,
flag as new_flag,
@rowFlag:=flag as old_flag,
@old as old_data,
@old:=data,
@old_ts as old_ts,
@old_ts:=ts
from test t, (select @rowFlag:=-1, @old:=null, @old_ts:=null) as def
where sn='a'
order by ts) as sub
where filter=1 and old_ts is not null;
答案 1 :(得分:0)
您可以检查此内容,因为它还包含旧值和新值。使用您的实际表名更改new_table。
select a.sn, a.ts as oldts, b.ts as newts,
a.data as old_data, b.data as data, a.flag as old_flag , b.flag as flag
from (
select sn, ts, data, flag ,
if(@oldSn = sn,@rowNumber := @rowNumber + 1,@rowNumber := 1) as row_number,
@oldSn := sn as curentsn
from new_table
order by sn, ts ) a
join (
select sn, ts, data, flag ,
if(@oldSn1 = sn,@rowNumber := @rowNumber + 1,@rowNumber := 1) as row_number,
@oldSn1 := sn as curentsn
from new_table
order by sn, ts ) b on a.sn = b.sn
and a.row_number + 1 = b.row_number
where a.flag != b.flag
以上查询的输出
sn, oldts, newts, old_data, data, old_flag, flag
a, 1494825611, 1494825613, a0, a1, 1, 0
a, 1494825617, 1494825623, a2, a3, 0, 1
a, 1494825645, 1494825648, a5, a6, 1, 0
b, 1494825643, 1494825644, b0, b1, 0, 1