Sql server 从分组结果中的多行中选择数据
我遇到了一个TSQL问题,我有一些分组结果,需要来自组成分组结果的每一行的一些数据,理想情况下-我希望第一行的收件人为“HuntGroup”,第二行的收件人为“Recipient” 分组结果中可能有1或2行,因此我只需要有2行的结果。有一个CorrelationCode将两条记录联系在一起-一行包含狩猎组信息,另一行包含应答用户 如果要测试,可以通过以下方式生成数据:Sql server 从分组结果中的多行中选择数据,sql-server,tsql,Sql Server,Tsql,我遇到了一个TSQL问题,我有一些分组结果,需要来自组成分组结果的每一行的一些数据,理想情况下-我希望第一行的收件人为“HuntGroup”,第二行的收件人为“Recipient” 分组结果中可能有1或2行,因此我只需要有2行的结果。有一个CorrelationCode将两条记录联系在一起-一行包含狩猎组信息,另一行包含应答用户 如果要测试,可以通过以下方式生成数据: CREATE TABLE #phone_calls ( Caller VARCHAR(200), Recipie
CREATE TABLE #phone_calls
(
Caller VARCHAR(200),
Recipient VARCHAR(200),
CorrelationCode VARCHAR(200),
StartTime VARCHAR(200),
EndTime VARCHAR(200),
);
INSERT INTO #phone_calls(Caller, Recipient, CorrelationCode, StartTime, EndTime)
VALUES
( 'user159', 'huntgroup1', 'AEF4562JJH', DATEADD(mi, -60,GETDATE()), DATEADD(mi, -60, GETDATE()) ),
( 'user159', 'user10', 'AEF4562JJH', DATEADD(mi, -59,GETDATE()), DATEADD(mi, -56, GETDATE()) ),
( 'user11', 'huntgroup2', 'OSJEJDJE883', DATEADD(mi, -58,GETDATE()), DATEADD(mi, -58, GETDATE()) ),
( 'user11', 'user5', 'OSJEJDJE883', DATEADD(mi, -57,GETDATE()), DATEADD(mi, -56, GETDATE()) ),
( 'user449', 'huntgroup1', 'SHEJJSMM27', DATEADD(mi, -56,GETDATE()), DATEADD(mi, -56, GETDATE()) ),
( 'user449', 'user91', 'SHEJJSMM27', DATEADD(mi, -55,GETDATE()), DATEADD(mi, -54, GETDATE()) ),
( 'user128', 'huntgroup1', 'USJEHHS45461', DATEADD(mi, -54,GETDATE()), DATEADD(mi, -54, GETDATE()) ),
( 'user128', 'user46', 'USJEHHS45461', DATEADD(mi, -53,GETDATE()), DATEADD(mi, -46, GETDATE()) ),
( 'user120', 'huntgroup1', 'SEES45646', DATEADD(mi, -52,GETDATE()), DATEADD(mi, -52, GETDATE()) ),
( 'user120', 'user5', 'SEES45646', DATEADD(mi, -51,GETDATE()), DATEADD(mi, -49, GETDATE()) ),
( 'user316', 'huntgroup1', 'LLLS45646', DATEADD(mi, -50,GETDATE()), DATEADD(mi, -50, GETDATE()) ),
( 'user316', 'user5', 'LLLS45646', DATEADD(mi, -49,GETDATE()), DATEADD(mi, -49, GETDATE()) ),
( 'user19', 'huntgroup1', 'YHJASA434', DATEADD(mi, -48,GETDATE()), DATEADD(mi, -48, GETDATE()) ),
( 'user202', 'huntgroup1', '78RTGDHDG', DATEADD(mi, -47,GETDATE()), DATEADD(mi, -47, GETDATE()) ),
( 'user141', 'huntgroup2', 'CFGBN1231', DATEADD(mi, -46,GETDATE()), DATEADD(mi, -46, GETDATE()) ),
( 'user168', 'huntgroup1', 'KKLDJ5463', DATEADD(mi, -45,GETDATE()), DATEADD(mi, -45, GETDATE()) ),
( 'user168', 'user91', 'KKLDJ5463', DATEADD(mi, -44,GETDATE()), DATEADD(mi, -40, GETDATE()) );
选择*将给出以下结果:
Caller Recipient CorrelationCode StartTime EndTime
user159 huntgroup1 AEF4562JJH Sep 13 2018 3:56PM Sep 13 2018 3:56PM
user159 user10 AEF4562JJH Sep 13 2018 3:57PM Sep 13 2018 4:00PM
user11 huntgroup2 OSJEJDJE883 Sep 13 2018 3:58PM Sep 13 2018 3:58PM
user11 user5 OSJEJDJE883 Sep 13 2018 3:59PM Sep 13 2018 4:00PM
user449 huntgroup1 SHEJJSMM27 Sep 13 2018 4:00PM Sep 13 2018 4:00PM
user449 user91 SHEJJSMM27 Sep 13 2018 4:01PM Sep 13 2018 4:02PM
user128 huntgroup1 USJEHHS45461 Sep 13 2018 4:02PM Sep 13 2018 4:02PM
user128 user46 USJEHHS45461 Sep 13 2018 4:03PM Sep 13 2018 4:10PM
user120 huntgroup1 SEES45646 Sep 13 2018 4:04PM Sep 13 2018 4:04PM
user120 user5 SEES45646 Sep 13 2018 4:05PM Sep 13 2018 4:07PM
user316 huntgroup1 LLLS45646 Sep 13 2018 4:06PM Sep 13 2018 4:06PM
user316 user5 LLLS45646 Sep 13 2018 4:07PM Sep 13 2018 4:07PM
user19 huntgroup1 YHJASA434 Sep 13 2018 4:08PM Sep 13 2018 4:08PM
user202 huntgroup1 78RTGDHDG Sep 13 2018 4:09PM Sep 13 2018 4:09PM
user141 huntgroup2 CFGBN1231 Sep 13 2018 4:10PM Sep 13 2018 4:10PM
user168 huntgroup1 KKLDJ5463 Sep 13 2018 4:11PM Sep 13 2018 4:11PM
user168 user91 KKLDJ5463 Sep 13 2018 4:12PM Sep 13 2018 4:16PM
我想在结果集中得到的是:
Caller HuntGroup Recipient CorrelationCode StartTime EndTime
user159 huntgroup1 user10 AEF4562JJH Sep 13 2018 3:56PM Sep 13 2018 4:00PM
user168 huntgroup1 user91 KKLDJ5463 Sep 13 2018 4:11PM Sep 13 2018 4:16PM
user316 huntgroup1 user5 LLLS45646 Sep 13 2018 4:06PM Sep 13 2018 4:07PM
user11 huntgroup2 user5 OSJEJDJE883 Sep 13 2018 3:58PM Sep 13 2018 4:00PM
user120 huntgroup1 user5 SEES45646 Sep 13 2018 4:04PM Sep 13 2018 4:07PM
user449 huntgroup1 user91 SHEJJSMM27 Sep 13 2018 4:00PM Sep 13 2018 4:02PM
user128 huntgroup1 user46 USJEHHS45461 Sep 13 2018 4:02PM Sep 13 2018 4:10PM
我可以用下面的SQL实现这一点,但这自然不起作用,因为它依赖于使用MIN和MAXRecipient,所以不起作用
SELECT
MIN(Caller) Caller,
MIN(Recipient) HuntGroup,
MAX(Recipient) Recipient,
MIN(CorrelationCode) CorrelationCode,
MIN(StartTime) StartTime,
MAX(EndTime) EndTime
FROM
(
SELECT
1 AS 'NumAnswers', Caller, Recipient, CorrelationCode, StartTime, EndTime
FROM #phone_calls
) c
GROUP BY c.CorrelationCode
HAVING SUM(NumAnswers) > 1
我也有玩过;使用cte,但我没有足够的经验从中获得这两个值
;WITH cte AS
(
SELECT Caller, Recipient AS 'HuntGroup', Recipient, CorrelationCode, StartTime, EndTime,
ROW_NUMBER() OVER (PARTITION BY CorrelationCode ORDER BY Recipient) rn
FROM #phone_calls
)
SELECT * FROM cte
WHERE rn = 2
因此,如果有任何TSQL大师能够提供解决方案,我们将不胜感激 你好
请检查这些解决方案之一是否符合您的需要我使用桌上电话而不是电话:
-- Option 1
;with MyCTE as (
select
[Caller], Recipient, CorrelationCode, StartTime, EndTime
,RN = ROW_NUMBER() over (partition by [Caller], CorrelationCode order by StartTime, EndTime)
from phone_calls
)
,MyCTE2 as (
select RN, [Caller], Recipient as HuntGroup, null as Recipient, CorrelationCode, StartTime, null as EndTime
from MyCTE
where RN = 1
union all
select RN, [Caller], null as HuntGroup, Recipient, CorrelationCode, null as StartTime, EndTime
from MyCTE
where RN = 2
)
select [Caller],MAX(HuntGroup),MAX(Recipient),CorrelationCode,MAX(StartTime),MAX(EndTime)
from MyCTE2
group by [Caller], CorrelationCode
having max(RN) > 1
GO
-- Option 2:
;with MyCTE as (
select
[Caller], Recipient, CorrelationCode, StartTime, EndTime
,RN = ROW_NUMBER() over (partition by [Caller], CorrelationCode order by StartTime, EndTime)
from phone_calls
)
,MyCTE1 as (
select RN, [Caller], Recipient, CorrelationCode, StartTime, EndTime
from MyCTE
where RN = 1
)
,MyCTE2 as (
select RN, [Caller], Recipient, CorrelationCode, StartTime, EndTime
from MyCTE
where RN = 2
)
SELECT
t1.Caller, t1.Recipient as HuntGroup, t2.Recipient, t1.CorrelationCode,
t1.StartTime, t2.EndTime
from MyCTE1 t1
LEFT JOIN MyCTE2 t2 ON t1.Caller = t2.Caller and t1.CorrelationCode = t2.CorrelationCode
where not t2.Caller IS NULL
相关代码:YHJASA434会发生什么情况?您不包括具有一行的记录?是的,正确,我们计划忽略这些记录,因为呼叫的第二段没有应答。工作非常出色!感谢您抽出时间提供两种不同的解决方案。将标记为答案。非常欢迎@James;-。我很高兴能帮上一点忙