排名,最后一个_值(),第一个_值,使用什么?|BigQuery | SQL

排名,最后一个_值(),第一个_值,使用什么?|BigQuery | SQL,sql,google-bigquery,Sql,Google Bigquery,我在Bigquery中有以下列:Value1、Value2、startdate和enddate。见下图 我想添加datewanted列,最大日期为value2。但值2之前的最大日期会更改 我想删除红线(keeprow=FALSE) 我使用了last_value或rank(),但似乎无法获得正确的输出。主要是因为last_值从value2中选择最后一个日期,而不是value2更改前的最后一个_值 据我所知,您希望Val2更改后的“第一个”结束日期 我不得不用类似的列重新创建表,这样您就可以使用

我在Bigquery中有以下列:Value1、Value2、startdate和enddate。见下图

  • 我想添加datewanted列,最大日期为value2。但值2之前的最大日期会更改
  • 我想删除红线(keeprow=FALSE)
我使用了last_value或rank(),但似乎无法获得正确的输出。主要是因为last_值从value2中选择最后一个日期,而不是value2更改前的最后一个_值


据我所知,您希望Val2更改后的“第一个”结束日期

我不得不用类似的列重新创建表,这样您就可以使用真实数据进行测试。 所以我想这个查询解决了你的问题:

WITH
data
AS (
  SELECT 'abc' as Value1, 123 as Value2, 1 as start_time, 2 as end_time union all
  SELECT 'abc' as Value1, 123 as Value2, 2 as start_time, 3 as end_time union all
  SELECT 'abc' as Value1, 1234 as Value2, 3 as start_time, 4 as end_time union all
  SELECT 'abc' as Value1, 123 as Value2, 4 as start_time, 5 as end_time union all
  SELECT 'abc' as Value1, 1234 as Value2, 5 as start_time, 6 as end_time union all
  SELECT 'abc' as Value1, 1234 as Value2, 6 as start_time, 7 as end_time union all
  SELECT 'abc' as Value1, 123 as Value2, 7 as start_time, 8 as end_time union all
  SELECT 'abc' as Value1, 123 as Value2, 8 as start_time, 9 as end_time union all
  SELECT 'abc' as Value1, 123 as Value2, 9 as start_time, 10 as end_time union all
  SELECT 'abc' as Value1, 123 as Value2, 10 as start_time, 11 as end_time union all
  SELECT 'abc' as Value1, 1234 as Value2, 11 as start_time, 12 as end_time union all
  SELECT 'abc' as Value1, 1234 as Value2, 12 as start_time, 13 as end_time union all
  SELECT 'abc' as Value1, 123 as Value2, 13 as start_time, 14 as end_time union all
  SELECT 'abc' as Value1, 123 as Value2, 14 as start_time, 15 as end_time
),
delta
AS (
  select *, 
    case when Value2 != lag(Value2) over (partition by Value1 order by start_time) then 1 else 0 end as value_changed
  from data
),
changes
AS (
  select Value1, Value2, start_time, end_time, sum(value_changed) over (partition by Value1 order by start_time) as change_index
  from delta
)
select Value1, Value2, change_index, min(start_time) as start_time, max(end_time) as end_time
from changes
group by Value1, Value2, change_index

“想要约会”的逻辑是什么?enddate句号中的最新条目,或该值的最新条目2?@NevilleKuyt该值的最新条目2。因此,不是最新的总体值,而是最新的前值2更改为另一个值。