2013-12-09 27 views
0

我正在研究一個Informix查詢,它將提供1)給我一個呼叫中心代理列表和2)給我他們最近的狀態。我有一個查詢可以完成我所需要的任何事情;Informix子​​查詢 - 如何正確執行它們

select b.resourcename, b.extension, a.eventtype 
from agentstatedetail as a, resource as b, team as c 
where date (eventdatetime) = TODAY 
    and (a.agentid = b.resourceid) 
    and (b.assignedteamid = c.teamid) 
    and (c.teamname like 'Team Name %') 
group by b.resourcename, b.extension, a.eventtype 
order by resourcename asc 

然而,這會給我的「事件類型」(事件類型顯示了美國代理人是在給定時間)的完整記錄。我試圖只拉最近的狀態。所以,我相信我需要對這個主查詢做一個子查詢,聲明類似於「如果主查詢的輸出在這個子查詢中找到,那麼保留它」。子查詢看起來像這樣;

select a.agentid, b.resourcename, c.teamname, max(a.eventdatetime) 
from agentstatedetail as a, resource as b, team as c 
where date (eventdatetime) = TODAY 
    and a.agentid = b.resourceid 
    and b.assignedteamid = c.teamid 
    and c.teamname like 'Team Name %' 
group by a.agentid, b.resourcename, c.teamname 

這個子查詢本身幾乎是我需要的所有東西,但它沒有事件類型。這個查詢如何工作?

這是我通常寫入子查詢但不能在Informix中工作的格式;

select m.agentid, m.resourcename, m.teamname, a2.eventtype 
from (
    select a.agentid,b.resourcename,c.teamname,max(a.eventdatetime) as maxtdate 
    from agentstatedetail as a 
    inner join resource as b on a.agentid = b.resourceid 
    inner join team as c on b.assignedteamid = c.teamid 
    where date (eventdatetime) = TODAY 
    and c.teamname like 'Team Name %' 
    group by a.agentid, b.resourcename, c.teamname 
) m 
inner join agentstatedetail a2 
    on a2.agentid = m.agentid and a2.eventdatetime = m.maxtdate 

我對你想要的列有點糊塗:

select a.agentid, b.resourcename, c.teamname, max(a.eventdatetime) as eventdatetime, a.eventtype from agentstatedetail as a, resource as b, team as c where date(eventdatetime) = TODAY and a.agentid=b.resourceid and b.assignedteamid=c.teamid and c.teamname like 'ITS %' and where a.eventdatetime in (select a.agentid, b.resourcename, c.teamname, max(a.eventdatetime) from agentstatedetail as a, resource as b, team as c where date(eventdatetime) = TODAY and a.agentid=b.resourceid and b.assignedteamid=c.teamid and c.teamname like 'Team Name %' group by a.agentid, b.resourcename, c.teamname) group by a.agentid, b.resourcename, c.teamname, a.eventtype order by max(a.eventdatetime) desc 

回答

1

嘗試做內與子查詢和agentstatedetail上的agentId和你發現這是最大日加入最後看看。如果這些不是,你將不得不在內部和外部查詢中改變它們。

+0

謝謝菲利普。儘管我不是用來做內部連接的,但這個說法很有效。我喜歡使用子查詢來完成全連接,例如,「where eventtype not in(select ...)」。我試圖寫它,但Informix將它踢回去了。你知道如果可能的話,它是如何寫成的? – Kimomaru

+1

你當然習慣於做內部連接,而不是顯式的方式。 :)。在你原來的查詢中,你有:'...從agentstatedetail作爲一個資源作爲b,團隊作爲c 其中a.agentid = b.resourceid 和b.assignedteamid = c.teamid ...'。這些是使用「舊時尚」方式的INNER JOIN。請參閱[這裏](http://stackoverflow.com/q/1018822/1385896)以獲得更好的解釋。 –

+0

有趣。我會研究這一點。謝謝,Filipe。 – Kimomaru