Добавить пропущенные ежемесячные строки - PullRequest
1 голос
/ 21 января 2020

Я хотел бы перечислить отсутствующую дату между двумя датами в запросе, например

Мои данные:

YEAR_MONTH  | AMOUNT    
202001  |  500    
202001  |  600    
201912  |  100    
201910  |  200
201910  |  100     
201909  |  400
201601  | 5000

Я хочу, чтобы запрос вернул

201912  |  100    
201911  |    0    
201910  |  300
201909  |  400     
201908  |    0
201907  |    0
201906  |    0
....    |    0
201712  |    0

я хочу последние 24 месяца с даты исполнения

Я сделал что-то похожее с датами, но не ГОД МЕСЯЦ yyyyMM

select date_sub(s.date_order ,nvl(d.i,0)) as date_order, case when d.i > 0 then 0 else s.amount end as amount
from
(--find previous date
select date_order, amount, 
        lag(date_order) over(order by date_order) prev_date,
        datediff(date_order,lag(date_order) over(order by date_order)) datdiff
from
( --aggregate
 select date_order, sum(amount) amount from your_data group by date_order )s
)s
--generate rows
lateral view outer posexplode(split(space(s.datdiff-1),' ')) d as i,x
order by date_order;

Я использую базу данных Cassandra с Apache Разъем улья

Может кто-нибудь мне помочь?

Ответы [ 2 ]

1 голос
/ 22 января 2020

date_range подзапрос генерирует 24 месяца (отрегулируйте, если хотите, чтобы диапазон отличался от 24 месяцев) назад от текущей даты. Присоединитесь к нему со своим набором данных, смотрите комментарии в этом демонстрационном коде:

with date_range as 
(--this query generates months range, check it's output
select date_format(add_months(concat(date_format(current_date,'yyyy-MM'),'-01'),-s.i),'yyyyMM') as year_month 
  from ( select posexplode(split(space(24),' ')) as (i,x) ) s --24 months
),

your_data as (--use your table instead of this example
select stack(7,
202001, 500,    
202001, 600,    
201912, 100,    
201910, 200,
201910, 100,     
201909, 400,
201601,5000 -----this date is beyond 24 months, hence it is not in the output
) as (YEAR_MONTH, AMOUNT )
)

select d.year_month, sum(nvl(s.amount,0)) as amount --aggregate
  from date_range d 
       left join your_data s on d.year_month=s.year_month
  group by d.year_month;

Результат:

d.year_month    amount
201801  0
201802  0
201803  0
201804  0
201805  0
201806  0
201807  0
201808  0
201809  0
201810  0
201811  0
201812  0
201901  0
201902  0
201903  0
201904  0
201905  0
201906  0
201907  0
201908  0
201909  400
201910  300
201911  0
201912  100
202001  1100

Используйте вашу таблицу вместо подзапроса your_data. При необходимости добавьте order by.

0 голосов
/ 21 января 2020

Так что, если я правильно понимаю, вы хотели бы добавить все даты, которые в настоящее время отсутствуют, потому что так сложилось, что amount было 0 в эти дни.

Вы можете использовать это:

select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) base_date from
    (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
    (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
    (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
    (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
    (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4
    having base_date between curdate() - interval 24 month and curdate();

Это в основном создает список дат между 1970 и 2200 годами (отфильтрованный по тем, которые вас интересуют).

Идея состоит в том, чтобы выбрать из этого в качестве подзапроса и объединить с имеющейся таблицей (в поле даты).

пример того, как это может выглядеть: возвращает пустые строки для несуществующие данные

относительно формата даты (ГОД МЕСЯЦ ГГГГММ) вы можете запустить это:

DATE_FORMAT(your_date,'%Y%m')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...