Я столкнулся с проблемой TSQL, когда у меня есть некоторые сгруппированные результаты, и мне нужны данные из каждой строки, которые составляют сгруппированные результаты, в идеале - я хотел бы, чтобы Получатель из первой строки обозначался как «HuntGroup и Получатель извторой ряд как «Получатель».
В сгруппированных результатах может быть 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()) );
A SELECT * даст следующие результаты:
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 и MAX (Recipient), поэтому он выиграл 'т работа.
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
Я также играл с WITH 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, которыеможет предложить решение, было бы оценено.