Как разбить строковый столбец на несколько строк, состоящих из отдельных слов и пар слов в BigQuery SQL?

Я пытаюсь (безуспешно) разбить строковый столбец в Google BigQuery на строки, содержащие все отдельные слова и все пары слов (рядом друг с другом и по порядку). Мне также нужно сохранить поле идентификатора для слов из IndataTable. Оба набора записей имеют 2 столбца.

IndataTable как IDT
ID WordString
1 яблоко-банан груша
2 моркови
3 синий красный зеленый желтый

OutdataTable как ODT
ID WordString
1 яблоко
1 банан
1 груша
1 яблоко-банан
1 банан груша < br> 2 моркови
3 синих
3 красных
3 зеленых
3 желтых
3 синих красных
3 красных зеленых
3 зеленых желтых (только пары, которые находятся рядом другое)

Возможно ли это в BigQuery SQL?

Изменить / Добавлено:
Это то, что у меня есть до сих пор, что позволяет разбить его на отдельные слова. Я действительно изо всех сил пытаюсь понять, как расширить это до пар слов. Я не знаю, можно ли это изменить или мне вообще нужен новый подход.

SELECT ID, split(WordString,' ') as Words
FROM (
  select * 
     from 
     (select ID, WordString from IndataTable)
)

person Dan    schedule 21.03.2018    source источник
comment
Не могли бы вы добавить код, который вы пробовали до сих пор?   -  person emerssso    schedule 21.03.2018
comment
Просто добавил мой существующий код, который работает с отдельными словами.   -  person Dan    schedule 21.03.2018


Ответы (1)


Ниже приведен стандартный SQL BigQuery.

#standardSQL
WITH IndataTable AS (
  SELECT 1 id, 'apple banana pear' WordString UNION ALL
  SELECT 2, 'carrot' UNION ALL
  SELECT 3, 'blue red green yellow' 
), words AS (
  SELECT id, word, pos
  FROM IndataTable, UNNEST(SPLIT(WordString,' ')) AS Word WITH OFFSET pos
), pairs AS (
  SELECT id, CONCAT(word, ' ', LEAD(word) OVER(PARTITION BY id ORDER BY pos)) pair
  FROM words
)
SELECT id, word AS WordString FROM words UNION ALL
SELECT id, pair AS WordString FROM pairs
WHERE NOT pair IS NULL
ORDER BY id  

с ожидаемым результатом:

Row id  WordString   
1   1   apple    
2   1   banana   
3   1   pear     
4   1   apple banana     
5   1   banana pear  
6   2   carrot   
7   3   blue     
8   3   red  
9   3   green    
10  3   yellow   
11  3   blue red     
12  3   red green    
13  3   green yellow     
person Mikhail Berlyant    schedule 21.03.2018
comment
Большое тебе спасибо. Это ТОЧНО то, что мне нужно, и он отлично подходит для моего варианта использования. Я не профессиональный программист и думаю, что мог бы потратить на это больше суток, не решив эту проблему. Спасибо за помощь Михаил. Надеюсь у тебя будет отличный день. - person Dan; 22.03.2018