Конечно. Вам просто нужен подзапрос для определения самой последней записи для каждого агента. Что-то вроде (непроверено):
select a.eventdatetime
,b.resourcename
,b.extension
,a.eventtype
from agentstatedetail as a
,resource as b
,team as c
,(SELECT agentid, MAX(eventdatetime) AS lastevent
FROM agentstatedetail
WHERE DATE(eventdatetime) = TODAY
GROUP BY agentid) AS d
where (a.agentid = b.resourceid)
and (b.assignedteamid = 10)
and (c.teamname like 'teamnamehere %')
and (d.agentid = a.agentid and a.eventdatetime = d.lastevent)
group by a.eventdatetime
,b.resourcename
,b.extension
,a.eventtype
order by eventdatetime desc
Возможно, вам придется взглянуть на индексацию agentstatedetail
, чтобы добиться максимальной эффективности.
ИЗМЕНИТЬ
В соответствии с вашим комментарием об избежании вложенного запроса и обработке пропуска уже замеченных значений агентидов, это довольно тривиальное решение на стороне клиента. Я не знаю точно, как вы справляетесь с этим на стороне PHP, но в основном вы хотите сделать что-то вроде этого:
$data = $db->query("select a.eventdatetime, b.resourcename, b.extension, a.eventtype
from agentstatedetail as a, resource as b, team as c
where date(eventdatetime) = date(current)
and (a.agentid = b.resourceid) and (b.assignedteamid = 10)
and (c.teamname like 'ITS Help Desk %')
group by a.eventdatetime, b.resourcename,
b.extension, a.eventtype
order by eventdatetime desc");
$agent = Array();
foreach($data as $row){
if(!$agent[$row['RESOURCENAME']]++) {
echo
"<TR bgcolor='#D0D0D0'><TD class='body'>" . $row['RESOURCENAME'] .
"<TD class='body'>" . $row['EVENTTYPE'] .
"</TD>";
}
}
Ассоциативный массив $agent
отслеживает, сколько записей было просмотрено для конкретного агента. Когда он пуст, это первое появление. Точное ненулевое число на самом деле бесполезно, мы просто используем постинкремент для повышения эффективности, вместо того, чтобы явно указывать $agent[$row['RESOURCENAME']]
в цикле.
person
RET
schedule
06.02.2014