我想删除/忽略/分离对于无用的日志有用的日志。有用的日志发生在flag
已知之前或之后。在第一个标记的日志之后发生无用的日志。
数据看起来像这样。在时间UID
看到的每个t
:
UID t flag PCP
'0000' 1 0 0
'0000' 2 1 0
'0000' 3 1 0
'0000' 4 0 0
'1111' 11 1 0
'1111' 12 0 0
'1111' 13 0 0
'2222' 1 0 0
'2222' 2 0 0
'2222' 3 0 0
是否有查询在PCP中输入0/1值,所以我可以
UID t flag PCP
'0000' 1 0 1
'0000' 2 1 1
'0000' 3 1 0
'0000' 4 0 0
'1111' 11 1 1
'1111' 12 0 0
'1111' 13 0 0
'2222' 1 0 0
'2222' 2 0 0
'2222' 3 0 0
注意:实际上标志是{0,1,2}中的\并且我希望PCP反映flag = 2.因此增量sum()将不起作用。
编辑:这个问题是类似的(不同的结局,我不擅长SQl足以知道如何从这个问题得到我想要的输出)。 Flag dates occurring after an event within individuals
另一个编辑:在sqlite中你可以比较> / =操作中的字符串和整数,我认为在SQL中你不能。我的表格全部都在文本中,但与整数相比已经足够好了,上面的问题因为输入SQL而破坏了。见http://sqlfiddle.com/#!3/00448/3
答案 0 :(得分:1)
我的答案是你发布的SQL Fiddle的答案。如果UserID和PCP是实际的TEXT数据类型,那么这应该可行。如果它们实际上是varchar,那么您可以使用=符号替换LIKE。
您只需要使用exists子句查找具有相同userID且具有conversiontagid = 2的任何记录并检查时间....
Update logs
Set PCP = '1'
Where exists (
select 1
from logs sub
where logs.userid LIKE sub.userid
and sub.conversiontagid = 2
and sub.t >= logs.t
)
我使用你的SQL小提琴做了一些假设,因为根据你上面的问题,它并不完全清楚。但是userID 4有三个记录都是同时发生的,所以我认为他们应该把所有三个记录都设置为1。
这是SQL小提琴,显示在select语句中使用的相同查询,而不是更新语句。