PSQL: как получить количество записей каждого значения в группе столбцов по другому столбцу

0

PSQL: у моей главной таблицы 20 миллионов записей, и когда я запускаю свой выбор, она работает в течение нескольких часов. Есть ли способ лучше написать эту запись?

Моя таблица:

Select * from lookup limit 10;
-------------------------
month      id
2010-01     598362
2010-01     598343
2010-02     598343
2010-02     988343
2010-03     789624
2010-04     789624
2010-05     789624
2010-06     899624 

Из таблицы я пытаюсь найти

  1. Количество различных идентификаторов за этот месяц
  2. Количество отдельных идентификаторов, которые также присутствовали в предыдущие 2 месяца

Мой оператор select (ниже) отлично работает с небольшими данными (до 100 000 записей)

--PSQL
select  month, 
    count (distinct id)id_ct,
    count (distinct case when (
                    id||(month-1) in (select distinct id||month from lookup ) 
                or  id||(month-2) in (select distinct id||month from lookup )  ) 
                    then id end) continuous_ct
    from lookup
    group by 1  order by 1

Результат:

month     id_ct continuous_ct
 2010-01    2   0
 2010-02    2   1
 2010-03    1   0
 2010-04    1   1
 2010-05    1   1
 2010-06    1   0

Спасибо!

Теги:
psql
postgrest

1 ответ

0
Лучший ответ

Если у вас есть индекс на id, тогда этот простой запрос должен работать. Просто левый присоединяется к таблице сам по себе. http://sqlfiddle.com/#!15/133a9/7/0:

select to_char(lookup_a.lookup_month, 'yyyy-mm'),
    count (distinct lookup_a.id) id_ct,
    count (distinct lookup_b.id) continuous_ct
from lookup lookup_a
left join lookup lookup_b 
    on lookup_b.id = lookup_a.id
    and lookup_b.lookup_month between lookup_a.lookup_month - interval '2 month'
    and lookup_a.lookup_month - interval '1 month'
group by 1  
order by 1
  • 0
    Я пересоздал таблицу с индексом по id, и это сработало. Большое спасибо
  • 0
    Рад, что смог помочь. Вы принимаете мое решение тогда?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню