Итак, давайте предположим таблицу с этими данными (обратите внимание, как я очистил имена столбцов для удаления пробелов, специальных символов и т. Д.):
+---+------------------+--------+------+----+------+---+
| 1 | 2019-03-28 08:00 | agent1 | foo1 | 60 | foo1 | 1 |
+---+------------------+--------+------+----+------+---+
| 1 | 2019-03-28 09:00 | agent2 | foo2 | 70 | foo2 | 2 |
| 2 | 2019-03-27 08:00 | agent3 | foo3 | 80 | foo3 | 3 |
| 2 | 2019-03-27 09:00 | agent4 | foo4 | 90 | foo4 | 4 |
+---+------------------+--------+------+----+------+---+
Как вы говорите, вы можете используйте функцию окна, чтобы получить то, что вы хотите.Тем не менее, позвольте мне показать вам метод, который сначала не требует оконной функции.
Вы хотите записи, где StartTime
является максимальным значением для этого DDI.Вы можете получить максимум StartTime
для каждого DDI с помощью следующего запроса:
SELECT
ddi,
max_start = MAX(StartTime)
FROM InboundCallsView
GROUP BY ddi
Затем вы можете присоединить этот запрос к вашей базовой таблице / представлению, чтобы получить нужные записи.Используя промежуточный CTE, вы можете сделать следующее:
WITH
ddiWithMaxStart AS
(
SELECT
ddi,
max_start = MAX(StartTime)
FROM InboundCallsView
GROUP BY ddi
)
SELECT InboundCallsView.*
FROM InboundCallsView
INNER JOIN ddiWithMaxStart ON
ddiWithMaxStart.ddi = InboundCallsView.ddi
AND ddiWithMaxStart.max_start = InboundCallsView.StartTime
Теперь, если вы действительно хотите использовать функции WINDOW, вы можете использовать ROW_NUMBER
для аналогичного эффекта:
WITH
ddiWithRowNumber AS
(
SELECT
InboundCallsView.*,
rn = ROW_NUMBER() OVER
(
PARTITION BY ddi
ORDER BY ddi, StartTime DESC
)
FROM InboundCallsView
)
SELECT *
FROM ddiWithRowNumber
WHERE rn = 1
Обратите внимание, что с помощью этого метода вам не нужно присоединять базовый вид / таблицу к промежуточному CTE.
Вы можете проверить производительность каждого метода, чтобы увидеть, какой из них лучше для вас.