我正在尝试跟踪的每个呼叫都有多行数据。数据看起来像这样
Call_ID | site | Agent_key | starttime | exit_reason
----------------------------------------------------
1234 | 7 | | 1 | transfer
1234 | 3 | 1010101 | 15 | transfer
1234 | 7 | 2121212 | 302 | transfer
1234 | 5 | 3232323 | 680 | transfer
我想创建一个名为“first_site”的列。当starttime为min(starttime)且Agent_key不为null时,参数为site。 (如果Agent_key为空,则表示呼叫仍在呼叫中心系统中,因此我不关心在那里代表哪个站点。
结果看起来像
Call_ID | site | Agent_key | starttime | exit_reason | first_site |
-------------------------------------------------------------------
1234 | 7 | | 1 | transfer | 3 |
1234 | 3 | 1010101 | 15 | transfer | 3 |
1234 | 7 | 2121212 | 302 | transfer | 3 |
1234 | 5 | 3232323 | 680 | transfer | 3 |
任何建议都将不胜感激!
答案 0 :(得分:2)
希望这会有所帮助
Select t.*, x.first_site
From YourTable t
Inner Join
(Select Call_Id,Min(site) As first_site
From YourTable
Where agent_key is not null -- Where Len(agent_key) > 0
Group By Call_Id)X
On t.Call_Id = x.Call_Id
答案 1 :(得分:2)
您可以使用简单的SCALAR SUBQUERY来实现此目的。
select outr.*, (select TOP 1 site
from tbl
where call_id=outr.call_id
and agent_key is not null
order by starttime asc) first_site
from tbl outr;
如果您需要组建网站,例如如果没有“IVR”,则使用ISNULL()
select outr.*, ISNULL((select TOP 1 site
from tbl
where call_id=outr.call_id
and agent_key is not null
order by starttime asc), 'IVR') first_site
from tbl outr;
答案 2 :(得分:1)
我的查询在没有附加表连接的情况下执行。;)
SELECT Call_ID, site, Agent_key, starttime, exit_reason,
CASE WHEN MIN(CASE WHEN Agent_key IS NOT NULL THEN starttime END) OVER () = starttime
THEN site
ELSE CASE WHEN MIN(CASE WHEN Agent_key IS NOT NULL THEN starttime END) OVER () != starttime
THEN MIN(CASE WHEN Agent_key IS NOT NULL THEN site END) OVER () END
END AS first_site
FROM dbo.your_table
SQLFiddle上的演示