【问题标题】:Separation of data rows based on a flag and timestamp基于标志和时间戳的数据行分离
【发布时间】:2014-12-09 18:55:17
【问题描述】:

我想删除/忽略/将有用的日志与无用的日志分开。有用的日志发生在flag 已知的时间之前或时间。无用的日志出现在第一个标记的日志之后。

数据看起来像这样。每次看到UIDt

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

注意:实际上 flag 是 \in {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

【问题讨论】:

  • 最终答案:sqlfiddle.com/#!7/86b91/1 基于接受的答案。我对速度有点不满意(我必须在 10^7 日志上执行此操作),并将寻求优化。

标签: sql sqlite timestamp


【解决方案1】:

我的答案基于您发布的 SQL Fiddle。如果 UserID 和 PCP 是实际的 TEXT 数据类型,那么这应该可以工作。如果它们实际上是 varchar,那么您可以将 LIKE 替换为 = 符号。

您只需要使用exists子句来查找具有相同用户ID且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 有三个同时发生的记录,所以我假设它们应该都将 PCP 设置为 1。

这里是 SQL Fiddle,显示了在 select 语句而不是 update 语句中使用的相同查询。

SQL Fiddle Example

【讨论】:

  • 哦,伙计,这很漂亮,谢谢。 :) 如果可能,您知道如何为所有没有 ConversionTagID = 2 的日志获取 CalculatedPCP = 1 吗?对不起,这不清楚!关键是在发生严重的 Conversion = 2 之后拒绝所有日志,但保留那些导致那个 OR 导致什么都没有的日志。
  • 大部分情况下我并不真正了解查询中发生了什么,否则我会这样做。谢谢 :) 您正在使用正确的用户 ID 创建所有日志的子表?然后发生一些等价。你怎么知道选择哪个t
  • 因此,如果用户 ID 没有 ConversionTagID = 2 的日志记录,您想为所有这些记录设置 CalculatedPCP = 1?将 EXISTS 更改为 NOT EXISTS 并删除 and sub.t >= logs.t。 t 列只是时间(基于您在帖子中所说的),因此原始查询是说是否存在此用户 ID 的另一条日志记录,并且该记录出现在我与之关联的那个之后,并且它有一个 conversiontagid = 2,然后设置 CalculatedPCP = 1。我建议阅读相关子查询以更好地了解正在发生的事情。
  • 会的。我想合并这两个查询,都是你原来的小提琴示例,并在没有发生转换的地方保留日志。再次感谢 :) 我要去阅读相关子查询。
猜你喜欢
  • 2019-04-21
  • 2023-03-31
  • 2021-03-28
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多