Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql BigQuery:获取行+;关于最近的前一行的信息,其中列x在前一行中有一些值_Sql_Google Bigquery - Fatal编程技术网

Sql BigQuery:获取行+;关于最近的前一行的信息,其中列x在前一行中有一些值

Sql BigQuery:获取行+;关于最近的前一行的信息,其中列x在前一行中有一些值,sql,google-bigquery,Sql,Google Bigquery,假设我有一个具有以下模式的表 name | type ---------------------- id | STRING timestamp | TIMESTAMP event_type | STRING some_value | STRING ... 我想获取'x'类型的所有事件。但是,对于返回的每一行,我还需要一个额外的参数。如果最近的事件中的事件

假设我有一个具有以下模式的表

name       | type
----------------------
id         | STRING
timestamp  | TIMESTAMP
event_type | STRING
some_value | STRING
...
我想获取
'x'
类型的所有事件。但是,对于返回的每一行,我还需要一个额外的参数。如果最近的事件
中的事件
具有
某些值='必要值'
,则此参数为布尔值,应为
TRUE

例如,假设以下行按时间戳升序排列:

event_type |  some_value
------------------------
y          | 'true value'
x          | 'not relevant'
y          | 'false value'
x          | 'not relevant 2'
y          | 'true value'
y          | 'false value'
x          | 'not relevant3'
x          | 'not relevant4'
我将从查询中返回以下行:

event_type |  some_value     | previous_true
-------------------------------------
x          | 'not relevant'  | TRUE
x          | 'not relevant2' | FALSE
x          | 'not relevant3' | FALSE
x          | 'not relevant4' | FALSE

我原以为加入就可以了,但我不知道这是怎么回事<代码>滞后
起初似乎也是个好主意,但后来我意识到,滞后将占据前一行,不管它是什么,我不确定我将如何使用它。

这里有一种方法:您可以使用“y”上的最大扫描来获得每个“x”最近的y的id。然后使用
join
进行计算:

select t.*,
       (case when some_value = 'necessary value' then 1 else 0 end) as previous_true
from (select t.*,
             max(case when event_type = 'y' then id end) over (order by timestamp) as yid
      from t
     ) t join
     t ty
     on ty.id = t.yid
where t.event_type = 'x';

我不确定
id
timestamp
的确切作用。此版本假定
id
相对于
时间戳一致增加。或者,您可以使用
时间戳
——但不清楚这是否足以让
连接

这里有一种方法:您可以使用“y”上的最大扫描来获取每个“x”最近的y的id。然后使用
join
进行计算:

select t.*,
       (case when some_value = 'necessary value' then 1 else 0 end) as previous_true
from (select t.*,
             max(case when event_type = 'y' then id end) over (order by timestamp) as yid
      from t
     ) t join
     t ty
     on ty.id = t.yid
where t.event_type = 'x';
我不确定
id
timestamp
的确切作用。此版本假定
id
相对于
时间戳一致增加。或者,您可以使用
时间戳
——但不清楚这是否足以让
加入

使用BigQuery标准SQL-请尝试以下操作
(确保取消选中“显示选项”下的“使用旧SQL”
复选框)

对于BigQuery遗留SQL-请尝试

使用BigQuery标准SQL-请尝试以下操作
(确保取消选中“显示选项”下的“使用旧SQL”
复选框)

对于BigQuery遗留SQL-请尝试


因此,遗产运作良好。然而,当我尝试使用非遗留版本时遇到了问题。当我用
mydataset.table
替换
YourTable
时,我得到一个
查询不受支持
错误。这是我能找到的错误消息的全部内容。如果您需要使用标准sql,但仍有问题需要自己解决,请提交新问题并提供更多详细信息(精确查询等)-评论的格式不允许在这种情况下提供有效的帮助-我将非常乐意提供帮助,因此遗产运作良好。然而,当我尝试使用非遗留版本时遇到了问题。当我用
mydataset.table
替换
YourTable
时,我得到一个
查询不受支持
错误。这就是我能找到的错误消息的全部内容。如果您需要使用标准sql,但仍有问题需要自己解决-请提交带有更多详细信息的新问题(精确查询等)-在这种情况下,评论格式不允许提供有效帮助-我将非常乐意提供帮助
event_type  some_value      previous_true    
x           not relevant    true     
x           not relevant2   false    
x           not relevant3   false    
x           not relevant4   false    
SELECT
  event_type, some_value, 
  previous_true = 'true value' AS previous_true
FROM (
  SELECT
    ts, event_type, some_value, 
    FIRST_VALUE(some_value) OVER(PARTITION BY grp ORDER BY ts) AS previous_true
  FROM (
    SELECT 
      ts, event_type, some_value, 
      SUM(step) OVER(ORDER BY ts) AS grp
    FROM (
      SELECT 
        ts, event_type, some_value, 
        IF(event_type = 'x' , 0, 1) AS step
      FROM 
        (SELECT 1 AS ts, 'y' AS event_type, 'true value' AS some_value),
        (SELECT 2 AS ts, 'x' AS event_type, 'not relevant' AS some_value),
        (SELECT 3 AS ts, 'y' AS event_type, 'false value' AS some_value),
        (SELECT 4 AS ts, 'x' AS event_type, 'not relevant2' AS some_value),
        (SELECT 5 AS ts, 'y' AS event_type, 'true value' AS some_value),
        (SELECT 6 AS ts, 'y' AS event_type, 'false value' AS some_value),
        (SELECT 7 AS ts, 'x' AS event_type, 'not relevant3' AS some_value),
        (SELECT 8 AS ts, 'x' AS event_type, 'not relevant4' AS some_value)
    )
  )
)
WHERE event_type = 'x'
ORDER BY ts