BigQuery получает строку над пустым столбцом

#sql #google-bigquery #where-clause #window-functions

#sql #google-bigquery #where-предложение #окно-функции

Вопрос:

Данные:

 SELECT 'aa' column_a, 'asdf' column_b UNION ALL
  SELECT 'bbb', '' UNION ALL
  SELECT 'ccc', 'asdf' UNION ALL
  SELECT 'ddd', '' UNION ALL
  SELECT 'eee', 'asdf' UNION ALL
  SELECT 'fff', 'asdf' 
  

введите описание изображения здесь

Каков наилучший способ получить строку прямо над пустой ячейкой? Например, я хотел бы отфильтровать строки 1 и 3 на основе того факта, что column_b в строках 2 и 4 пусты (в этом примере). К сожалению, простой оператор where не работает, но как можно было бы получить строку над пустой ячейкой?

Спасибо

Ответ №1:

Я думаю, вы хотите lead() — но вам нужен столбец, который определяет порядок строк, я предположил id :

 select t.* except(lead_column_b)
from (
    select t.*, lead(column_b) over(order by id) lead_column_b
    from mytable t
) t
where lead_column_b is not null
  

Обратите внимание, что при этом будет отфильтрована последняя строка в таблице (поскольку в ней нет «следующей» строки). Если вы этого не хотите, мы можем добавить немного больше логики:

 select t.* except(lead_column_b, rn)
from (
    select t.*, 
        lead(column_b) over(order by id) lead_column_b,
        row_number() over(order by id desc) rn
    from mytable t
) t
where lead_column_b is not null or rn = 1
  

Ответ №2:

Вы ищете lead() функцию

 with data as (
  SELECT 'aa' column_a, 'asdf' column_b UNION ALL
  SELECT 'bbb', '' UNION ALL
  SELECT 'ccc', 'asdf' UNION ALL
  SELECT 'ddd', '' UNION ALL
  SELECT 'eee', 'asdf' UNION ALL
  SELECT 'fff', 'asdf'
),
get_next_value as (
  select *, lead(column_b,1) over(order by column_a asc) as next_col_b from data
)
select column_a, column_b, next_col_b
from get_next_value
where ifnull(next_col_b,"Last Row") <> '' -- This accounts for the last row in the table