Аналіз даних за допомогою BigQuery: Пошук останнього попереднього значення перед певним

Аналіз даних за допомогою BigQuery: Пошук останнього попереднього значення перед певним

4 Березня 2024 в 18:04 120

Задача:

У світі аналізу даних іноді необхідно виконувати складні запити, щоб відповісти на конкретні питання. Одним з таких випадків є пошук останнього попереднього значення перед певним у великому масиві даних. В цій статті ми розглянемо, як вирішити цю задачу за допомогою BigQuery, використовуючи SQL запити.

Збираємо вихідні дані:

Перш ніж приступити до написання SQL запиту, ми повинні мати вихідні дані, з якими будемо працювати. Для нашого прикладу, візьмемо список значень:

my_list=['S', 'S', 'S', 'L', 'L', 'L', 'A', 'B', 'B', 'L', 'C', 'D', 'D', 'L']

Цей список містить послідовність символів, і наша мета - знайти останнє попереднє значення перед кожним входженням 'L'.

Розв'язок за допомогою BigQuery:

Для розв'язання цієї задачі ми скористаємося BigQuery, який є потужним інструментом для роботи з великими обсягами даних. Основна ідея полягає в тому, щоб використати функції віконного аналізу, такі як LEAD і LAG, для отримання необхідних результатів.

WITH data AS (
  SELECT ['S', 'S', 'S', 'L', 'L', 'L', 'A', 'B', 'B', 'L', 'C', 'D', 'D', 'L'] AS elements
),
element_pairs AS (
  SELECT
    element,
    LEAD(element) OVER (ORDER BY OFFSET) AS next_element,
    LAG(element) OVER (ORDER BY OFFSET) AS prev_element
  FROM (
    SELECT
      element,
      ROW_NUMBER() OVER () AS OFFSET
    FROM
      data,
      UNNEST(elements) AS element
  )
)
SELECT
  'L' AS L,
  prev_element AS preceding_value
FROM
  element_pairs
WHERE
  next_element = 'L';

Цей запит використовує спільний табличний вираз (CTE) для створення віртуальної таблиці, що містить наші вихідні дані. Потім ми використовуємо функції віконного аналізу LEAD і LAG, щоб отримати наступний та попередній елементи в послідовності. Запит повертає пари значень '(L, preceding_value)', де preceding_value - це останнє попереднє значення перед 'L'.

Результати:

Після виконання цього запиту ми отримаємо очікувані результати:

('L','S') ('L','S') ('L','S') ('L','B') ('L','D')

Це і є шукані пари значень, які відповідають нашому запиту.