Sql server 从分组结果中的多行中选择数据

Sql server 从分组结果中的多行中选择数据,sql-server,tsql,Sql Server,Tsql,我遇到了一个TSQL问题,我有一些分组结果,需要来自组成分组结果的每一行的一些数据,理想情况下-我希望第一行的收件人为“HuntGroup”,第二行的收件人为“Recipient” 分组结果中可能有1或2行,因此我只需要有2行的结果。有一个CorrelationCode将两条记录联系在一起-一行包含狩猎组信息,另一行包含应答用户 如果要测试,可以通过以下方式生成数据: CREATE TABLE #phone_calls ( Caller VARCHAR(200), Recipie

我遇到了一个TSQL问题,我有一些分组结果,需要来自组成分组结果的每一行的一些数据,理想情况下-我希望第一行的收件人为“HuntGroup”,第二行的收件人为“Recipient”

分组结果中可能有1或2行,因此我只需要有2行的结果。有一个CorrelationCode将两条记录联系在一起-一行包含狩猎组信息,另一行包含应答用户

如果要测试,可以通过以下方式生成数据:

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;-。我很高兴能帮上一点忙