我有一个表存储时间戳如下
Date Order ID
2016-05-31 11:46:54 UTC 14567
2016-05-31 11:46:43 UTC 876
2016-05-31 11:46:24 UTC 1345
2016-05-31 11:46:04 UTC 7345
我想区分当前行和上一行之间的秒数差异,并使用google bigquery将值存储在单独的列中。
Date Order Difference In Seconds
2016-05-31 11:46:54 UTC 14567 0
2016-05-31 11:46:43 UTC 876 11
2016-05-31 11:46:24 UTC 1345 19
2016-05-31 11:46:04 UTC 7345 42
答案 0 :(得分:1)
以下假设您的DATE字段为STRING数据类型
如果它已经是TIMESTAMP数据类型 - 您应该从查询
SELECT
DATE, id,
IFNULL(TIMESTAMP_TO_SEC(TIMESTAMP(DATE)) -
TIMESTAMP_TO_SEC(TIMESTAMP(prev_date))
, 0) AS Difference_In_Seconds
FROM (
SELECT
DATE, id,
LEAD(DATE) OVER (ORDER BY DATE DESC) AS prev_date
FROM
(SELECT '2016-05-31 11:46:54 UTC' AS DATE, 14567 AS id),
(SELECT '2016-05-31 11:46:43 UTC' AS DATE, 876 AS id),
(SELECT '2016-05-31 11:46:24 UTC' AS DATE, 1345 AS id),
(SELECT '2016-05-31 11:46:04 UTC' AS DATE, 7345 AS id)
)
ORDER BY DATE DESC
添加以解决DATE字段为TIMESTAMP数据类型
的情况为简单起见 - 请尝试以下方法:o)
SELECT
DATE, id,
IFNULL(TIMESTAMP_TO_SEC(TIMESTAMP(DATE)) -
TIMESTAMP_TO_SEC(TIMESTAMP(prev_date))
, 0) AS Difference_In_Seconds
FROM (
SELECT
DATE, id,
LEAD(DATE) OVER (ORDER BY DATE DESC) AS prev_date
FROM
(SELECT STRING(DATE) AS DATE, id FROM [test:product.tab1] )
)
ORDER BY DATE DESC
答案 1 :(得分:0)
您可以使用timestamp_diff()
和lag()
:
select t.*,
coalesce(timestamp_diff(lag(date) over (order by date), date, second),
0) as diff_in_seconds
from t;
您的数据可能是当前行与 next 行之间的差异。为此,请使用lead()
:
select t.*,
coalesce(timestamp_diff(lead(date) over (order by date), date, second),
0) as diff_in_seconds
from t;