简体   繁体   中英

How to get first value under a specific row in BigQuery?

I have the following dataset in BigQuery: Dataset

When the type is V, count is always equal to zero. When the type is V, I would like the column count to get the first value under this row with type T. The rows are ordered according to group_id and position column.

This is the final result I would like to have: Desired dataset

I tried this

FIRST_VALUE( count )
  OVER ( 
    PARTITION BY id_group,id_person
    ORDER BY
    CASE WHEN type LIKE "T" THEN 1 ELSE 0 END DESC,
      position
      ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
  ) as NEW_count

but it always gives me the first count with a type T, when I want the first value below the row.

I don't think this scenario can be solved using navigation functions, since the closest T value position is not deterministic (lead, lag, first, last, nth value).

You need to query the same dataset to find the closest t_value using subqueries.

Here you have a working example:

WITH source_data AS (
SELECT 'A1' AS id_group, 'a' AS id_perso, 1 AS position, 'V' AS type, 0 AS count
UNION ALL
SELECT 'A1', 'b', 2, 'V', 0
UNION ALL
SELECT 'A1', 'c', 3, 'T', 13
UNION ALL
SELECT 'A1', 'd', 4, 'V', 0
UNION ALL
SELECT 'A1', 'e', 5, 'T', 5
UNION ALL
SELECT 'A1', 'f', 6, 'T', 7
UNION ALL
SELECT 'A1', 'g', 7, 'V', 0
UNION ALL
SELECT 'A1', 'h', 8, 'V', 0
UNION ALL
SELECT 'A1', 'i', 9, 'V', 0
UNION ALL
SELECT 'A1', 'j', 10,' 'T, 0
)


SELECT *, 
      (SELECT count FROM source_data counts WHERE counts.position = 
            (SELECT MIN(t_values.position) FROM source_data t_values WHERE t_values.type='T' and t_values.position > source.position)) 
FROM source_data source

You can coalesce the t_value if you need 0s instead of nulls

You can consider the below query for your requirement.

with cte as (

  select 'A1' id_group, 'a' id_person, 1 position, 'V'type, 0 count union all 
  select 'A1','b',2,'V',0 union all 
  select 'A1','c',3,'T',13 union all 
  select 'A1','d',4,'V',0 union all 
  select 'A1','e',5,'T',5 union all 
  select 'A1','f',6,'T',7 union all 
  select 'A1','g',7,'V',0 union all 
  select 'A1','h',8,'V',0 union all 
  select 'A1','i',9,'V',0 union all 
  select 'A1','j',10,'T',0 
)

select *,last_value(count_1 ignore nulls) over (order by position desc) new_count,
from (select *,case when type='V' and count=0 then null else count 
end count_1
from cte
)
order by position

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM