基于标志和时间戳分离数据行

时间:2014-12-09 18:55:18

标签: sql sqlite timestamp

我想删除/忽略/分离对于无用的日志有用的日志。有用的日志发生在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

1 个答案:

答案 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语句中使用的相同查询,而不是更新语句。

SQL Fiddle Example