San*_*ana 7 sql window-functions google-bigquery
我有一张表如下:
WITH
table1 AS (
SELECT
TIMESTAMP '2016-10-18 2:51:45' AS ts,
'AB4' AS packId,
FALSE AS stat,
'x' AS position
UNION ALL
SELECT
TIMESTAMP '2016-10-18 2:54:11',
'AB4',
FALSE,
'x'
UNION ALL
SELECT
TIMESTAMP '2016-10-18 3:01:17',
'AB4',
FALSE,
'x'
UNION ALL
SELECT
TIMESTAMP '2016-10-18 3:05:42',
'AB4',
TRUE,
NULL
UNION ALL
SELECT
TIMESTAMP '2016-10-18 3:06:24',
'AB4',
FALSE,
'x'
UNION ALL
SELECT
TIMESTAMP '2016-10-18 3:06:36',
'AB4',
TRUE,
'y'
UNION ALL
SELECT
TIMESTAMP '2016-10-18 3:07:41',
'AB4',
FALSE,
'x')
SELECT
ts,
packId,
stat,
position,
LAG(position) OVER prev_pos AS previous_position1,
LAG(position,2) OVER prev_pos AS previous_position2
FROM
table1
WINDOW
prev_pos AS (
PARTITION BY
packId
ORDER BY
ts)
Run Code Online (Sandbox Code Playgroud)
结果如下所示:
我想获取不为 null 的先前值(从列位置),如结果表中所示,我希望这些 null 值是先前的非 null 值,在本例中这两个值都是“x”。(有数千行具有空位置,因此当前行的最后一个非空位置可能是其之前的数千行)
总之:如何忽略bigquery中Lag的空值?
以下是 BigQuery 标准 SQL
WITH table1 AS (
SELECT TIMESTAMP '2016-10-18 2:51:45' AS ts, 'AB4' AS packId, FALSE AS stat, 'x3' AS position UNION ALL
SELECT TIMESTAMP '2016-10-18 2:54:11', 'AB4', FALSE, 'x2' UNION ALL
SELECT TIMESTAMP '2016-10-18 3:01:17', 'AB4', FALSE, 'x1' UNION ALL
SELECT TIMESTAMP '2016-10-18 3:05:42', 'AB4', TRUE, NULL UNION ALL
SELECT TIMESTAMP '2016-10-18 3:06:24', 'AB4', FALSE, 'x' UNION ALL
SELECT TIMESTAMP '2016-10-18 3:06:36', 'AB4', TRUE, 'y' UNION ALL
SELECT TIMESTAMP '2016-10-18 3:07:41', 'AB4', FALSE, 'x'
)
SELECT
ts,
packId,
stat,
position,
NTH_VALUE(position, 1 IGNORE NULLS) OVER prev_pos AS previous_position1,
NTH_VALUE(position, 2 IGNORE NULLS) OVER prev_pos AS previous_position2
FROM table1
WINDOW prev_pos AS
(PARTITION BY packId ORDER BY ts DESC ROWS BETWEEN 1 FOLLOWING and UNBOUNDED FOLLOWING)
-- ORDER BY ts
Run Code Online (Sandbox Code Playgroud)
带输出
正如您所看到的,不需要子查询 - 对原始查询的唯一更改是
分别替换LAG(position)
和LAG(position,2)
为 -NTH_VALUE(position, 1 IGNORE NULLS)
和NTH_VALUE(position, 2 IGNORE NULLS)
和
prev_pos
向窗口添加适当的框架子句
归档时间: |
|
查看次数: |
2138 次 |
最近记录: |