Ответы пользователя по тегу PostgreSQL
  • Как заполнить дополнить данные пустыми значениями (postgres)?

    Amver
    @Amver
    зачем группировать, если в таблице по 1й записи на день?
    да и группировка без агрегатной функции сломается при первом дубле даты

    для случая 1 запись/день можно сделать так:
    select coalesce(product_count,0), dt::date from generate_series('2015-05-05'::date, '2015-05-08', '1 day') dt
    left join statistic on created_at::date = dt::date
    Ответ написан
    Комментировать
  • Как написать сложный запрос Postgresql с date_trunc, sum, group by и generate_series?

    Amver
    @Amver
    Не совсем понял почему "duration" типа "string", но если там числовые значения, то полагаю нужно нечто подобное должно дать желаемый результат:
    SELECT tm "minute",
    	sum(CASE WHEN type = 'norm' then duration::real ELSE 0 END) "duration_norm",
    	sum(CASE WHEN type = 'idle' then duration::real ELSE 0 END) "duration_idle",
    	sum(CASE WHEN type = 'norm' then 1 ELSE 0 END) "norm",
    	sum(CASE WHEN type = 'idle' then 1 ELSE 0 END) "idle"
    	
    FROM generate_series('2015-01-16 17:16:00'::timestamp, '2015-01-16 18:18:00', '1 minute') tm
    left join table1 t1 ON date_trunc('minute', t1.time) = tm
    group by tm
    ORDER BY tm
    Ответ написан
    Комментировать
  • Как улучшить или ускорить запрос?

    Amver
    @Amver
    Можно использовать window-функцию row_number() для минимизации обращения к таблице
    with max_m_ep as
    (	select tue.user_id, te.material_id, max(tue.episode_id) AS "_ep" from user_episode tue
    									left join episode te ON te.id = tue.episode_id
    									group by tue.user_id, te.material_id )
    select * from
    (
    	select e.*, row_number() OVER (partition by e.material_id order by e.id) AS ep_order
    	from episode e
    	left join max_m_ep mx ON mx.material_id = e.material_id and mx.user_id = 2
    	  where e.id >= mx._ep
    		or mx._ep is null
    
    	  order by e.id
    ) data
    where ep_order < 5;
    Ответ написан