您需要使用timestampdiff 或datediff,因为您不能使用- 运算符减去两个时间戳。这是一个可重现的示例,展示了如何在几秒钟、几分钟和几小时内执行此操作。
create or replace transient table users
(
users varchar,
action_date timestamp_ntz
);
insert overwrite into users
values ('simon', '2020-01-01T01:00:00'),
('simon', '2020-01-01T02:00:00'),
('simon', '2020-01-02T01:00:00'),
('simon', '2020-01-02T02:00:00'),
('simon', '2020-01-03T01:00:00'),
('simon', '2020-01-04T01:00:00'),
('jen', '2020-01-01T01:00:00'),
('jen', '2020-01-02T01:00:00'),
('jen', '2020-01-03T01:00:00'),
('jen', '2020-01-04T01:00:00')
;
SELECT
USERS as users,
action_date as action_date,
RANK() OVER (PARTITION BY USERS ORDER BY ACTION_DATE ASC) as row_number,
timestampdiff('minutes', action_date, LAG(action_date) OVER (PARTITION BY users ORDER BY action_date)) AS minutes_interval,
timestampdiff('seconds', action_date, LAG(action_date) OVER (PARTITION BY users ORDER BY action_date)) AS seconds_interval,
timestampdiff('hours', action_date, LAG(action_date) OVER (PARTITION BY users ORDER BY action_date)) AS hours_interval
from USERS
ORDER BY 1, 2, 3;
以上产生:
+-----+-----------------------------+----------+----------------+----------------+--------------+
|USERS|ACTION_DATE |ROW_NUMBER|MINUTES_INTERVAL|SECONDS_INTERVAL|HOURS_INTERVAL|
+-----+-----------------------------+----------+----------------+----------------+--------------+
|jen |2020-01-01 01:00:00.000000000|1 |NULL |NULL |NULL |
|jen |2020-01-02 01:00:00.000000000|2 |-1440 |-86400 |-24 |
|jen |2020-01-03 01:00:00.000000000|3 |-1440 |-86400 |-24 |
|jen |2020-01-04 01:00:00.000000000|4 |-1440 |-86400 |-24 |
|simon|2020-01-01 01:00:00.000000000|1 |NULL |NULL |NULL |
|simon|2020-01-01 02:00:00.000000000|2 |-60 |-3600 |-1 |
|simon|2020-01-02 01:00:00.000000000|3 |-1380 |-82800 |-23 |
|simon|2020-01-02 02:00:00.000000000|4 |-60 |-3600 |-1 |
|simon|2020-01-03 01:00:00.000000000|5 |-1380 |-82800 |-23 |
|simon|2020-01-04 01:00:00.000000000|6 |-1440 |-86400 |-24 |
+-----+-----------------------------+----------+----------------+----------------+--------------+