所以我有一些看起来像这样的数据:
USER_ID text_field TIMESTAMP
1 0000001 dragon 2021-06-04 21:23:30.612
2 0000001 dragon 2021-06-04 21:23:55.411
3 0000001 dragon 2021-06-04 21:27:35.418
4 0000002 pitbull 2021-06-04 19:17:53.211
5 0000002 dragon 2021-06-04 19:47:53.211
6 0000002 dragon 2021-06-04 19:57:53.211
7 0000003 dragon 2021-06-05 10:00:53.211
8 0000003 dragon 2021-06-05 10:02:53.211
9 0000003 earth 2021-06-05 10:04:53.211
10 0000003 dragon 2021-06-05 10:06:53.211
11 0000003 dragon 2021-06-05 10:08:53.211
我希望看到的是具有 dragon
一词的征服条目的第一个和最后一个时间戳之间的差异
因此,在 ID 0000001 中,我们将所有条目都设为 dragon
,因此对于这种情况,我想要第 3 行减去第 1 行。这是所有具有 Dragon 和 ID = 的条目的 max(timestamp) - min(timestamp) 0000001。
对于 ID 2,请注意并非所有的都是 Dragon,但我只希望 dragon
条目具有相同的差异。
一个 ID 也可能有非强制 dragon
条目,例如 ID 0000003。这里我需要两个块中的强制条目不同。这意味着 ID 0000003 ,我需要 row 8 - row 7
和 row 11 - row 10
。
最终输出:
USER_ID time_diff
0000001 (2021-06-04 21:27:35.418 - 2021-06-04 21:23:30.612)
0000002 (2021-06-04 19:57:53.211 - 2021-06-04 19:47:53.211)
0000003 (2021-06-05 10:02:53.211 - 2021-06-05 10:00:53.211)
0000003 (2021-06-05 10:08:53.211 - 2021-06-05 10:06:53.211)
很明显,这些只是 time_diff 的方程,我真的很想要这个列中的差异。
答案 0 :(得分:1)
你可以这样做:
select user_id , min(TIMESTAMP) , max(TIMESTAMP), datediff(second,max(TIMESTAMP),min(TIMESTAMP)) time_diff
from (
select *
, rank() over (partition by user_id order by TIMESTAMP)
-rank() over (partition by user_id,text_field order by TIMESTAMP) rn
from users
) t
where text_field = 'dragon'
group by user_id , rn
order by user_id
答案 1 :(得分:1)
如果您只特别关心“龙”,您可以使用非龙的累积总和直到每一行来识别每个组。然后聚合:
select userid, min(timestamp), max(timestamp)
from (select t.*,
sum(case when text_field <> 'dragon' then 1 else 0 end) over (partition by user_id order by timestamp) as grp
from t
) t
where text_field = 'dragon'
group by userid, grp;
您可以随意计算差异。