2016-03-15 2 views
0

У меня есть этот запрос, который выбирает количество каждого «messagecode» на основе определенного интервала времени.Построить postgresql-запрос на основе нескольких условий

SELECT coalesce(count(case when messagecode = 'F-100' then 'F-100' end), 0) as fixed, 
     coalesce(count(case when messagecode = 'H-100' then 'H-100' end), 0) as hope, 
     coalesce(count(case when messagecode = 'G-100' then 'G-100' end), 0) as good, 
     coalesce(count(case when messagecode = 'T-100' then 'T-100' end), 0) as todo 
     FROM messages WHERE messagetime >= current_timestamp - ('5' * interval '1 minute') 

Выход для записи

fixed: 115, 
hope: 334, 
good: 1045, 
todo: 6000 

Я хочу сделать что-то подобное, но, чтобы выбрать количество уникальных идентификаторов испытывают эту messagecode, я знаю, что я должен начать делать

SELECT coalesce(count(DISTINCT id), 0) ... 

Но моя проблема в том, что я еще не знаю, как это сделать для нескольких условий по одному и тому же запросу. Ожидаемый результат:

fixed: 13, (13 unique ids exist) 
hope: 45, (45 unique ids exist) 
good: 110, (110 unique ids exist) 
todo: 414 (414 unique ids exist) 

Как я смогу его достичь?

+1

Попробуйте 'граф (отличный случай, когда ... тогда конец идентификатор)' –

+0

Действительно, большое спасибо, я никогда не думал, изменяя код сообщения с идентификатором @then сделает это. Вы можете добавить ответ, который примет его. Благодарю. –

ответ

1

Запрос может выглядеть следующим образом:

SELECT coalesce(count(distinct case when messagecode = 'F-100' then id end), 0) as fixed, 
     coalesce(count(distinct case when messagecode = 'H-100' then id end), 0) as hope, 
     coalesce(count(distinct case when messagecode = 'G-100' then id end), 0) as good, 
     coalesce(count(distinct case when messagecode = 'T-100' then id end), 0) as todo 
     FROM messages WHERE messagetime >= current_timestamp - ('5' * interval '1 minute') 
Смежные вопросы