Упрощение данного запроса GCP BQ

# #sql #google-bigquery

Вопрос:

Можем ли мы свести это большое утверждение к минимуму в упрощенном виде.

 case
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 1 MONTH)) then 12
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 2 MONTH)) then 11
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 3 MONTH)) then 10
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 4 MONTH)) then 9
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 5 MONTH)) then 8
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 6 MONTH)) then 7
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 7 MONTH)) then 6
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 8 MONTH)) then 5
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 9 MONTH)) then 4
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 10 MONTH)) then 3
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 11 MONTH)) then 2
    when EXTRACT(MONTH from GIVEN_DATE) = EXTRACT(MONTH from DATE_SUB(CURRENT_DATE(), interval 12 MONTH)) then 1
  end as MONTH_NUMBER
 

Ответ №1:

Рассмотрим следующий подход

 select given_date, 1   mod(extract(month from given_date)   5, 12) as MONTH_NUMBER       
 

Если применить к некоторым фиктивным датам — вывод будет

введите описание изображения здесь

Ответ №2:

Вы ищете что-то подобное?

 select 1   date_diff(current_date(), given_date, month) 
 

Это делает много предположений, например, в given_date течение года. Если нет, то арифметика по модулю, вероятно, делает то, что вы хотите:

 select 1   (date_diff(current_date(), given_date, month) % 12)
 

Комментарии:

1. Я пытаюсь захватить диапазон в числовом значении. Например, диапазон: 07/2020 — 06/2021 , затем 07/2020 должно быть 1, 08/2020 должно быть 2 и так далее, и, наконец, 06/2021 должно быть 12.