Запрос для самой последней активности - сбой

Я размышлял над соответствующими сообщениями и просто не могу добиться успеха. Мне нужен отчет, который показывает последнюю заметку для клиента. Я действительно близок, но запрос обычно "пропускает" фактическую последнюю запись. Скажем, я запустил отчет, чтобы показать последнюю запись за последние 6 месяцев, и показывает последнюю запись для "bob" как 8/1/13. Когда я смотрю в таблицу, есть примечание 10/23/13. Я проверил, как-то данные были испорчены, но выглядит хорошо. Если кто-то может пролить свет, почему у меня есть несколько "почти последних заметок" в запросе, а не на самом последнем, я был бы очень благодарен. Вот запрос, который я использовал с комментариями, объясняющими это:

SELECT 
DISTINCT ON (c.client_id) --the client id
g.name, -- the office location
MAX (n.date_service),
n.date_creation, 
sv.code, -- the service / activity code
c.name_lastfirst_cs, -- client name
n.date_service, 
s.staff_id -- staff id
FROM notes n, clients c, services sv, staff s, groups g
WHERE n.zrud_service = sv.zzud_service
AND n.visibility_flag = '1' -- 1 = valid note
AND n.zrud_client = c.zzud_client
AND n.zrud_staff = s.zzud_staff
AND n.zrud_group = g.zzud_group
AND g.name = 'HALIFAX' -- am specifying a single location

-- the next 4 lines were an attempt to query specific time range and actitity codes
--AND s.code IN ('10101', '10102', '10201', 10202','10203','10204','10205','10401','10402','10403','10405')
-- AND n.date_service >= '1/1/2010'
-- AND n.date_service<= '11/7/2013'
-- AND n.date_service BETWEEN (now() - '800 days'::interval)::timestamp AND now() 

GROUP BY g.name,sv.code, c.client_id, c.name_lastfirst_cs, s.staff_id,
n.date_service, n.date_creation
1 ответ

Если вам нужна последняя запись на основе some_date в таблице, использование DISTINCT ON вместе с ORDER BY some_date DESC является хорошим вариантом:

SELECT 
DISTINCT ON (c.client_id) --the client id
g.name, -- the office location
n.date_service,
n.date_creation, 
sv.code, -- the service / activity code
c.name_lastfirst_cs, -- client name
n.date_service, 
s.staff_id -- staff id
FROM notes n, clients c, services sv, staff s, groups g
WHERE n.zrud_service = sv.zzud_service
AND n.visibility_flag = '1' -- 1 = valid note
AND n.zrud_client = c.zzud_client
AND n.zrud_staff = s.zzud_staff
AND n.zrud_group = g.zzud_group
AND g.name = 'HALIFAX' -- am specifying a single location
ORDER BY c.client_id, n.date_service DESC;

Обратите внимание, что нет необходимости в GROUP BY или MAX, DISTINCT ON заботится о группировке и ORDER BY для получения только последней записи.

licensed under cc by-sa 3.0 with attribution.