gpt4 book ai didi

sql - 根据多列多行数据提取数据

转载 作者:行者123 更新时间:2023-12-01 05:21:26 24 4
gpt4 key购买 nike

我有以下数据代表进入我们中心并被转移到顾问 (CSO) 的调用流。

CallID   Sequence    Action          Location         Input    NextLocation

1135 0 CallStart NULL NULL NULL
1135 1 MenuStart EFTPosHelpDesk NULL NULL
1135 2 KeyPress EFTPosHelpDesk 3 TransferCSO
1135 3 TransferEntry EFTPosHelpDesk NULL NULL
1135 4 TransferFlag NULL NULL NULL
1135 5 AccessNum NULL NULL NULL
1135 6 Transfer NULL NULL NULL
1135 7 Hangup NULL NULL NULL

我使用 MS SQL Management Studio 2005 来提取数据,但是数据本身存储在 MS SQL 2000 服务器上。

数据库中记录了数百万个调用,我需要提取客户被转移到 CSO 的 CallID。告诉我调用已转移到 CSO 的目标数据完全如下:
@Sequence 2 -> NextLocation = 'TansferCSO'
@Sequence 3 -> Action = 'TransferEntry'
@Sequence 4 -> Action = 'TransferFlag'
@Sequence 5 -> Action = 'AccessNum'
@Sequence 6 -> Action = 'Transfer'
@Sequence 7 -> Action = 'Hangup'

...它总是按照这个顺序,但是“顺序”编号和“位置”会有所不同,因为有些调用可以平均运行 50 - 70 步,而且我们有 100 个 IVR(位置)。

我对 SQL 还很陌生,我尝试过使用 FETCH 和 IF/ELSE 但没有成功。由于数据在 MS SQL2000 服务器上,ROW_NUMBER() 将无法工作。

任何示例或建议将不胜感激。

最佳答案

这将根据存在的所有 6 个条目(以任何顺序)为您提供已转移到 CSO 的所有调用(CallID)。

  select CallID
from yourTable
where Action in ('TransferEntry', 'TransferFlag',
'AccessNum', 'Transfer', 'Hangup')
or NextLocation = 'TransferCSO'
group by CallID
having count(distinct Action) = 6;

注意:假设是 NextLocation='TransferCSO' 的行具有不同但特定的 Action ,例如“按键”

如果你绝对需要确保 6 个事件是连续的,你可以使用下面的。最后对 JOIN 条件的微小变化也可以用于顺序而不一定是连续的。
create table #tmpCalls (CallID int, Sequence int, Action varchar(20));

select c.CallID, c.Sequence, c.Action
from
(
select CallID
from yourTable
where Action in ('TransferEntry', 'TransferFlag',
'AccessNum', 'Transfer', 'Hangup')
or (Action = 'KeyPress' and NextLocation = 'TransferCSO')
group by CallID
having count(distinct Action) = 6
) a
join yourTable c on c.CallID = a.CallID
where c.Action in ('TransferEntry', 'TransferFlag',
'AccessNum', 'Transfer', 'Hangup')
or (c.Action = 'KeyPress' and c.NextLocation = 'TransferCSO');

create clustered index #ix_tmpCalls on #tmpCalls(CallID, Sequence, Action);

select distinct a.CallID
from #tmpCalls a -- or perhaps just: b.Sequence > a.Sequence
join #tmpCalls b on b.Action = 'TransferEntry' and b.Sequence = a.Sequence + 1
join #tmpCalls c on c.Action = 'TransferFlag' and c.Sequence = b.Sequence + 1
join #tmpCalls d on d.Action = 'AccessNum' and d.Sequence = c.Sequence + 1
join #tmpCalls e on e.Action = 'Transfer' and e.Sequence = d.Sequence + 1
join #tmpCalls f on f.Action = 'Hangup' and f.Sequence = e.Sequence + 1
where a.Action = 'KeyPress' and a.NextLocation = 'TransferCSO';

请注意,子查询是缩小候选范围的原始查询。临时表用于使其快速执行,因为我们可以将它聚集在 3 列周围。

关于sql - 根据多列多行数据提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16431648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com