SQL group by 内的两个日期不同
SQL different between two dates inside group by
我有这个 table -
----------------------------------------------
ID | user | eventID | type | timestamp
----------------------------------------------
1 | 1 | 1 | 3 | 2019-02-08 15:30:00
2 | 1 | 1 | 3 | 2019-02-08 15:31:00
3 | 1 | 1 | 9 | 2019-02-08 15:31:30
4 | 2 | 1 | 3 | 2019-02-08 15:32:00
5 | 2 | 1 | 3 | 2019-02-08 15:32:45
6 | 3 | 1 | 3 | 2019-02-08 15:33:00
7 | 3 | 1 | 9 | 2019-02-08 15:34:00
8 | 3 | 2 | 3 | 2019-02-08 15:35:00
9 | 3 | 2 | 9 | 2019-02-08 15:36:00
我试图为每个用户找出每个事件的类型 3 和类型 9 之间的时间差。
例如,此 table 的输出将是 -
----------------------------------------------
ID | user | eventID | timeDifference in sec
----------------------------------------------
1 | 1 | 1 | 30
2 | 3 | 1 | 60
3 | 3 | 2 | 60
如您所见,每个用户可以有多个事件,不同的用户也可以有相同的事件。有些用户和事件同时具有这两种类型,有些则没有。可能有多个类型 3 和类型 9 事件,但我想要彼此最接近的事件之间的差异。类型 9 总是发生在类型 3 之后。我还有一个单独的列,其中包含类型 9 事件的不同 ID(如果有帮助的话)。所以我试图为每个用户找到每个事件的这两种类型之间的时间差。
我该怎么做?
编辑 - 我忘了提及每个用户的每个事件可以有多对类型 3 和类型 9 事件。所以我想要所有这些相邻的对的差异,而不是每组只有一个差异。
为此 table -
----------------------------------------------
ID | user | eventID | type | timestamp
----------------------------------------------
1 | 1 | 1 | 3 | 2019-02-08 15:30:00
2 | 1 | 1 | 3 | 2019-02-08 15:31:00
3 | 1 | 1 | 9 | 2019-02-08 15:31:30
4 | 2 | 1 | 3 | 2019-02-08 15:32:00
5 | 2 | 1 | 3 | 2019-02-08 15:32:45
6 | 3 | 1 | 3 | 2019-02-08 15:33:00
7 | 3 | 1 | 9 | 2019-02-08 15:34:00
8 | 3 | 2 | 3 | 2019-02-08 15:35:00
9 | 3 | 2 | 9 | 2019-02-08 15:36:00
10 | 3 | 2 | 3 | 2019-02-08 15:37:00
11 | 3 | 2 | 9 | 2019-02-08 15:37:40
输出将是 -
----------------------------------------------
ID | user | eventID | timeDifference in sec
----------------------------------------------
1 | 1 | 1 | 30
2 | 3 | 1 | 60
3 | 3 | 2 | 60
4 | 3 | 2 | 40
edit - 我的编辑问了一个不同的问题。此处的原始问题已得到解答。
这回答了问题的原始版本:
select user, eventid,
(to_seconds(min(case when type = 9 then timestamp end)),
to_seconds(max(case when type = 3 then timestamp end))
) as diff_seconds
from t
group by user, eventid;
这 returns 最早的“9”时间戳和最晚的“3”时间戳之间的差异。
我有这个 table -
----------------------------------------------
ID | user | eventID | type | timestamp
----------------------------------------------
1 | 1 | 1 | 3 | 2019-02-08 15:30:00
2 | 1 | 1 | 3 | 2019-02-08 15:31:00
3 | 1 | 1 | 9 | 2019-02-08 15:31:30
4 | 2 | 1 | 3 | 2019-02-08 15:32:00
5 | 2 | 1 | 3 | 2019-02-08 15:32:45
6 | 3 | 1 | 3 | 2019-02-08 15:33:00
7 | 3 | 1 | 9 | 2019-02-08 15:34:00
8 | 3 | 2 | 3 | 2019-02-08 15:35:00
9 | 3 | 2 | 9 | 2019-02-08 15:36:00
我试图为每个用户找出每个事件的类型 3 和类型 9 之间的时间差。
例如,此 table 的输出将是 -
----------------------------------------------
ID | user | eventID | timeDifference in sec
----------------------------------------------
1 | 1 | 1 | 30
2 | 3 | 1 | 60
3 | 3 | 2 | 60
如您所见,每个用户可以有多个事件,不同的用户也可以有相同的事件。有些用户和事件同时具有这两种类型,有些则没有。可能有多个类型 3 和类型 9 事件,但我想要彼此最接近的事件之间的差异。类型 9 总是发生在类型 3 之后。我还有一个单独的列,其中包含类型 9 事件的不同 ID(如果有帮助的话)。所以我试图为每个用户找到每个事件的这两种类型之间的时间差。
我该怎么做?
编辑 - 我忘了提及每个用户的每个事件可以有多对类型 3 和类型 9 事件。所以我想要所有这些相邻的对的差异,而不是每组只有一个差异。
为此 table -
----------------------------------------------
ID | user | eventID | type | timestamp
----------------------------------------------
1 | 1 | 1 | 3 | 2019-02-08 15:30:00
2 | 1 | 1 | 3 | 2019-02-08 15:31:00
3 | 1 | 1 | 9 | 2019-02-08 15:31:30
4 | 2 | 1 | 3 | 2019-02-08 15:32:00
5 | 2 | 1 | 3 | 2019-02-08 15:32:45
6 | 3 | 1 | 3 | 2019-02-08 15:33:00
7 | 3 | 1 | 9 | 2019-02-08 15:34:00
8 | 3 | 2 | 3 | 2019-02-08 15:35:00
9 | 3 | 2 | 9 | 2019-02-08 15:36:00
10 | 3 | 2 | 3 | 2019-02-08 15:37:00
11 | 3 | 2 | 9 | 2019-02-08 15:37:40
输出将是 -
----------------------------------------------
ID | user | eventID | timeDifference in sec
----------------------------------------------
1 | 1 | 1 | 30
2 | 3 | 1 | 60
3 | 3 | 2 | 60
4 | 3 | 2 | 40
edit - 我的编辑问了一个不同的问题。此处的原始问题已得到解答。
这回答了问题的原始版本:
select user, eventid,
(to_seconds(min(case when type = 9 then timestamp end)),
to_seconds(max(case when type = 3 then timestamp end))
) as diff_seconds
from t
group by user, eventid;
这 returns 最早的“9”时间戳和最晚的“3”时间戳之间的差异。