BigQuery - 查找特定值之前的最后一个值

问题描述 投票:0回答:1

我有一个价值观列表

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

从左到右浏览列表时,每次得到“L”时,我都需要找到最后一个不是“L”的值

我期待着

('L','S') ('L','S') ('L','S') ('磅') ('L','D')

我试过了

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';

但获得 ('L','S') ('L','S') ('二') ('磅') ('L','D')

google-bigquery
1个回答
0
投票

使用以下方法

WITH data AS (
  SELECT ['S', 'S', 'S', 'L', 'L', 'L', 'A', 'B', 'B', 'L', 'C', 'D', 'D', 'L'] AS elements
)
SELECT L, SPLIT(segment)[OFFSET(0)] AS preceding_value
FROM data, 
UNNEST(REGEXP_EXTRACT_ALL(ARRAY_TO_STRING(elements, ','), r"(.(?:,L)+)")) segment WITH OFFSET AS a,
UNNEST(REGEXP_EXTRACT_ALL(segment, r'L')) AS L    

有输出

© www.soinside.com 2019 - 2024. All rights reserved.