我有一个价值观列表
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')
使用以下方法
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
有输出