当前行和上一行之间的秒数差异,并使用google bigquery将值存储在单独的列中

时间:2016-05-31 19:31:35

标签: sql google-bigquery

我有一个表存储时间戳如下

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

2 个答案:

答案 0 :(得分:1)

以下假设您的DATE字段为STRING数据类型
如果它已经是TIMESTAMP数据类型 - 您应该从查询

下面删除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;