2015-07-17 2 views
3

я следующая таблицаПодсчет столбцов в запросе с группой по

id integer NOT NULL DEFAULT nextval('cl_id_seq'::regclass), 
    from_number character varying(30), 
    to_number character varying(30), 
    message text, 
    received_at timestamp with time zone, 
    sent_at timestamp with time zone, 
    reply_batch boolean DEFAULT false, 
    chat_id character varying(20), 
    insert_time timestamp with time zone DEFAULT now(), 
    own_account boolean DEFAULT false, 

Я следующий запрос, который будет возвращать chat_ids разговоров, только если последнего сообщения (проверено на колонке insert_time) связана с chat_id имеет столбец own_account равным false.

select chat_id from message_log 
where own_account = 'f' 
and insert_time in 
(
select distinct max(insert_time) from message_log group by chat_id 
) 

выше SQL работает отлично, но он возвращает разговоры без проверки, сколько раз own_account столбец верно в чате. Я хотел бы добавить возможность возвращать chat_ids из разговоров также в зависимости от того, сколько раз own_account является истинным.

Я пробовал много разных SQL-запросов, но я не могу добиться этой работы. Любая помощь будет оценена по достоинству.

Надеюсь, я достаточно ясен. если смутить что-нибудь, пожалуйста, прокомментируйте.

EDIT

Я загрузил данные по SQL Fiddle здесь

http://sqlfiddle.com/#!15/1d7dc/2

Если следующий запрос бежал он будет возвращать сообщения, относящиеся к чату

select * from message_log where chat_id = '1412' order by insert_time 

Последнее сообщение не из own_account, и их осталось не больше 3 own_account Сообщения в результатах, поэтому следующий запрос должен возвращать это chat_id но это не

select m.chat_id 
from message_log m 
inner join 
    (select chat_id, max(insert_time) as max_insert_time, 
    count(case when own_account='t' then 1 else 0 end) as true_count 
    from message_log 
    group by chat_id) as latest 
on m.chat_id = latest.chat_id and 
    m.insert_time = latest.max_insert_time 
where 
    m.own_account = 'f' and latest.true_count <= 3 

EDIT 2

Я создал еще один SQL скрипку здесь с одной записью

http://sqlfiddle.com/#!15/ad045/1

+0

Граф (случай бит должен быть sum (case – Gary

+0

@Gary Я изменил его на сумму, но и я загрузил базу данных одной строкой с сообщением, имеющим собственный_account false, и он не возвращает его – Arya

+0

@Gary Я просто добавил еще одну скрипку – Arya

ответ

2

Вы можете построить производную таблицу, в которой записаны последние времена вставки для всех чатов, а затем узнать, является ли эта последняя запись own_account='f'

select m.chat_id 
from message_log m 
inner join 
    (select chat_id, max(insert_time) as max_insert_time 
    from message_log 
    group by chat_id) as latest 
on m.chat_id = latest.chat_id and 
    m.insert_time = latest.max_insert_time 
where 
    m.own_account = 'f' 

Расширение его найти чатов, где последняя является own_account = «е», но имеет по крайней мере 3 own_account='t' статей

select m.chat_id 
from message_log m 
inner join 
    (select chat_id, max(insert_time) as max_insert_time, 
    sum(case when own_account='t' then 1 else 0 end) as true_count 
    from message_log 
    group by chat_id) as latest 
on m.chat_id = latest.chat_id and 
    m.insert_time = latest.max_insert_time 
where 
    m.own_account = 'f' and latest.true_count >= 3 

SQLFiddle доступный на http://sqlfiddle.com/#!15/ee8c0/2

+0

Спасибо за ваш ответ, я получаю сообщение об ошибке при запуске обоих запросов, я вставил сообщение об ошибке для второго здесь. Http://pastebin.com/4X57RtDw – Arya

+0

Извините, были некоторые глупые опечатки , – Gary

+0

На этот раз не было сообщений об ошибках, я проверю результаты запроса утром, и я приму свой ответ. – Arya

Смежные вопросы