SQL: Как эффективно извлечь определенные цифры из целого числа? - PullRequest
0 голосов
/ 22 марта 2020

Я использую большой запрос Google, и у меня есть поле ВРЕМЯ, такое же целое, как ЧЧММСС. Мне нужно извлечь определенные цифры, чтобы создать 3 столбца: TIME_SECOND, TIME_MINUTE, TIME_HOUR.

Пример столбца TIME и обязательных столбцов целых чисел:

   TIME     TIME_HOUR    TIME_MINUTE  TIME_SECOND
----------  ---------    ---------   ----------
     2      |  00     |    00     |      02
    10      |  00     |    00     |      10
   111      |  00     |    01     |      11
  1858      |  00     |    18     |      58  
 12316      |  01     |    23     |      16 
234559      |  23     |    45     |      59

В идеале он должен быть максимально эффективным, так как этот расчет будет выполняться для большой таблицы.

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  time,
  CAST(time / 10000 AS INT64) AS time_hour,
  MOD(CAST(FLOOR(time / 100) AS INT64), 100) AS time_minute,
  MOD(time, 100 ) AS time_second 
FROM `project.dataset.table`   

Если применить к образцу данных из вашего вопроса - вывод

Row     time        time_hour   time_minute time_second  
1       2           0           0           2    
2       10          0           0           10   
3       111         0           1           11   
4       1858        0           18          58   
5       12316       1           23          16   
6       234559      23          45          59  

Выше дает целые числа - в то же время в вашем примере вывода похоже, что вы можете ожидать строки: (00, 01, et c.) - если так - используйте ниже

#standardSQL
SELECT 
  time, 
  y[OFFSET(1)] AS time_hour,
  y[OFFSET(2)] AS time_minute,
  y[OFFSET(3)] AS time_second
FROM `project.dataset.table`,
UNNEST([CAST(10000000 + time AS STRING)]) x,
UNNEST([STRUCT(REGEXP_EXTRACT_ALL(x, r'\d\d') AS y)])   

с выводом

Row     time        time_hour   time_minute time_second  
1       2           00          00          02   
2       10          00          00          10   
3       111         00          01          11   
4       1858        00          18          58   
5       12316       01          23          16   
6       234559      23          45          59   
0 голосов
/ 22 марта 2020

Вы можете использовать арифметику c:

select (time / 10000) as time_hour,
       (floor(time / 100) % 100) as time_minute,
       (time % 100 )as time_second
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...