我不擅长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")
非常感谢任何帮助
答案 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等等。