Bigquery Window Id - PullRequest
       3

Bigquery Window Id

0 голосов
/ 11 апреля 2019

Мне нужно создать новый столбец с идентификатором первой записи в окне.Для такой таблицы:

uniqueId | position
-------------------
      01 | First
      02 | Last 
      03 | First
      04 | Cont 
      05 | Cont 
      06 | Cont 
      07 | Cont 
      08 | Cont 
      09 | Cont 
      10 | Last 
      11 | First
      12 | Cont 
      13 | Cont 
      14 | Cont 
      15 | Last 
      16 | First
      17 | Cont 
      18 | Last 

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

uniqueId | position | result
----------------------------
      01 | First    | 01
      02 | Last     | 01
      03 | First    | 03
      04 | Cont     | 03
      05 | Cont     | 03
      06 | Cont     | 03
      07 | Cont     | 03
      08 | Cont     | 03
      09 | Cont     | 03
      10 | Last     | 03
      11 | First    | 11
      12 | Cont     | 11
      13 | Cont     | 11
      14 | Cont     | 11
      15 | Last     | 11
      16 | First    | 16
      17 | Cont     | 16
      18 | Last     | 16

Я пробовал несколько разных подходов, используя оконные функции BQ, но не повезло = /

Помоги мне ОбиВан Кеноби, Ты моя единственная надежда.

1 Ответ

0 голосов
/ 11 апреля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT uniqueId, position, 
  FIRST_VALUE(uniqueId) OVER(PARTITION BY grp ORDER BY IF(position = 'First', 0, 1)) result
FROM (
  SELECT uniqueId, position, 
    COUNTIF(position = 'First') OVER(ORDER BY CAST(uniqueId AS INT64)) grp
  FROM `project.dataset.table`
)

Вы можете протестировать, поиграть с выше, используя пример данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '01' uniqueId, 'First' position UNION ALL
  SELECT '02', 'Last ' UNION ALL
  SELECT '03', 'First' UNION ALL
  SELECT '04', 'Cont ' UNION ALL
  SELECT '05', 'Cont ' UNION ALL
  SELECT '06', 'Cont ' UNION ALL
  SELECT '07', 'Cont ' UNION ALL
  SELECT '08', 'Cont ' UNION ALL
  SELECT '09', 'Cont ' UNION ALL
  SELECT '10', 'Last ' UNION ALL
  SELECT '11', 'First' UNION ALL
  SELECT '12', 'Cont ' UNION ALL
  SELECT '13', 'Cont ' UNION ALL
  SELECT '14', 'Cont ' UNION ALL
  SELECT '15', 'Last ' UNION ALL
  SELECT '16', 'First' UNION ALL
  SELECT '17', 'Cont ' UNION ALL
  SELECT '18', 'Last ' 
)
SELECT uniqueId, position, 
  FIRST_VALUE(uniqueId) OVER(PARTITION BY grp ORDER BY IF(position = 'First', 0, 1)) result
FROM (
  SELECT uniqueId, position, 
    COUNTIF(position = 'First') OVER(ORDER BY CAST(uniqueId AS INT64)) grp
  FROM `project.dataset.table`
)
-- ORDER BY uniqueId   

с результатом

Row uniqueId    position    result   
1   01          First       01   
2   02          Last        01   
3   03          First       03   
4   04          Cont        03   
5   05          Cont        03   
6   06          Cont        03   
7   07          Cont        03   
8   08          Cont        03   
9   09          Cont        03   
10  10          Last        03   
11  11          First       11   
12  12          Cont        11   
13  13          Cont        11   
14  14          Cont        11   
15  15          Last        11   
16  16          First       16   
17  17          Cont        16   
18  18          Last        16    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...