在不同的时间段内获取每日更改

时间:2018-03-22 11:47:03

标签: google-cloud-platform google-bigquery

我不擅长SQL,我很难在BigQuery中创建具体的查询。

我有列的表:value(int),ts(timestamp),date(字符串形式为yyyy-mm-dd(2018-03-21))

我需要构建查询,该查询将计算一段时间(天,周)的每日更改加上当天的最新值。
每个日期(日)可以有多个值,因此我认为当天有变化,从今天获取和最后一个值,从昨天减去最后一个值。

所以,如果我有数据:

value   ts                        date   
5   2018-01-01 01:59:34.000 UTC 2018-01-01   
2   2018-01-01 18:39:34.000 UTC 2018-01-01   
6   2018-01-02 14:06:14.000 UTC 2018-01-02   
6   2018-01-02 16:52:54.000 UTC 2018-01-02      
1   2018-01-02 19:39:34.000 UTC 2018-01-02   
5   2018-01-02 22:26:14.000 UTC 2018-01-02   
5   2018-01-03 03:59:34.000 UTC 2018-01-03

输出应该是包含行的列表:

date      change  value   
2018-01-02  3      5  

我已经开始使用此查询,但它返回与select中相同的行数(因为它使用的是分析函数,而不是聚合),即我不知道如何使用第一个和最后一个值为每个日期获取一行。之后我想再做一次选择并使用LEAD / LAG获取前一行(日期)的值并计算变化(可能总体上更简单)

SELECT
  FIRST_VALUE(value) OVER (PARTITION BY date ORDER BY ts ASC) AS first_value,
  LAST_VALUE(value) OVER (PARTITION BY date ORDER BY ts ASC) AS last_value,
  date
FROM
  `table`
WHERE
  ts BETWEEN TIMESTAMP("2018-01-01 00:00:00.000")
  AND TIMESTAMP("2018-01-03 23:59:59.000")

非常感谢任何帮助

1 个答案:

答案 0 :(得分:4)

下面的示例适用于BigQuery Standard SQL

    
#standardSQL
WITH `project.dataset.table` AS (
  SELECT 5 value, TIMESTAMP '2018-01-01 01:59:34.000 UTC' ts,  '2018-01-01' dt UNION ALL   
  SELECT 2, TIMESTAMP '2018-01-01 18:39:34.000 UTC',  '2018-01-01' UNION ALL   
  SELECT 6, TIMESTAMP '2018-01-02 14:06:14.000 UTC',  '2018-01-02' UNION ALL   
  SELECT 6, TIMESTAMP '2018-01-02 16:52:54.000 UTC',  '2018-01-02' UNION ALL      
  SELECT 1, TIMESTAMP '2018-01-02 19:39:34.000 UTC',  '2018-01-02' UNION ALL   
  SELECT 5, TIMESTAMP '2018-01-02 22:26:14.000 UTC',  '2018-01-02' UNION ALL   
  SELECT 5, TIMESTAMP '2018-01-03 03:59:34.000 UTC',  '2018-01-03' 
)
SELECT dt, 
  IFNULL(lastValue - LAG(lastValue) OVER(ORDER BY dt),0) AS change,
  lastValue AS value
FROM (
  SELECT * FROM (
    SELECT dt,
      FIRST_VALUE(value) OVER(myWindow) AS firstValue,
      LAST_VALUE(value) OVER(myWindow) AS lastValue
    FROM `project.dataset.table`
    WINDOW myWindow AS (PARTITION BY dt ORDER BY ts ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
  ) GROUP BY 1,2,3
) ORDER BY dt

结果为

Row dt          change  value    
1   2018-01-01  0       2    
2   2018-01-02  3       5    
3   2018-01-03  0       5     
  

我不知道每个日期如何获得第一行和最后一行的一行。

正如您所看到的,我在原始select语句中更改了分析函数的窗口,然后允许轻松分组并每天获取一行。剩下的就像你计划的那样 - 获得LAG等等。

相关问题