Пожалуйста, скопируйте и запустите следующий скрипт
DECLARE @Customers TABLE (CustomerId INT)
DECLARE @Orders TABLE ( OrderId INT, CustomerId INT, OrderDate DATETIME )
DECLARE @Calls TABLE (CallId INT, CallTime DATETIME, CallToId INT, OrderId INT)
-----------------------------------------------------------------
INSERT INTO @Customers SELECT 1
INSERT INTO @Customers SELECT 2
INSERT INTO @Customers SELECT 3
-----------------------------------------------------------------
INSERT INTO @Orders SELECT 10, 1, DATEADD(d, -20, GETDATE())
INSERT INTO @Orders SELECT 11, 1, DATEADD(d, -10, GETDATE())
INSERT INTO @Orders SELECT 12, 2, DATEADD(d, -8, GETDATE())
INSERT INTO @Orders SELECT 13, 2, DATEADD(d, -6, GETDATE())
INSERT INTO @Orders SELECT 14, 3, DATEADD(d, -4, GETDATE())
-----------------------------------------------------------------
INSERT INTO @Calls SELECT 101, DATEADD(d, -19, GETDATE()), 1, NULL
INSERT INTO @Calls SELECT 102, DATEADD(d, -17, GETDATE()), 1, NULL
INSERT INTO @Calls SELECT 103, DATEADD(d, -9, GETDATE()), 1, NULL
INSERT INTO @Calls SELECT 104, DATEADD(d, -6, GETDATE()), 1, NULL
INSERT INTO @Calls SELECT 105, DATEADD(d, -5, GETDATE()), 1, NULL
INSERT INTO @Calls SELECT 106, DATEADD(d, -4, GETDATE()), 2, NULL
INSERT INTO @Calls SELECT 107, DATEADD(d, -2, GETDATE()), 2, NULL
INSERT INTO @Calls SELECT 108, DATEADD(d, -2, GETDATE()), 3, NULL
Я хочу обновить таблицу @Calls и мне нужны следующие результаты.
![alt text](https://i.stack.imgur.com/RwVeV.png)
Я использую следующеезапрос (Старый запрос перед ответом)
UPDATE @Calls
SET OrderId = (
CASE
WHEN (s.CallTime > e.OrderDate)
THEN e.OrderId
END
)
FROM @Calls s INNER JOIN @Orders e ON s.CallToId = e.CustomerId
Редактировать: Сейчас я использую этот запрос
UPDATE c set OrderID = o1.OrderID
from @Calls c inner join @Orders o1 on c.CallTime > o1.OrderDate
left join @Orders o2 on c.CallTime > o2.OrderDate
and o2.OrderDate > o1.OrderDate
where o2.OrderID is null
and o1.CustomerId = c.CallToId
и результат моего запроса не тот, который мне нужен.
Требование: Как видите, есть два заказа.Один на 2010-12-12
, а другой на 2010-12-22
.Я хочу обновить @Calls
таблицу с соответствующим OrderId относительно CallTime.
Короче говоря, если последующие Заказы добавлены, и есть дальнейшие вызовы, то мы предполагаем, что новый вызов связан с большинствомнедавний заказ
Примечание: Это примерные данные, поэтому у меня всегда два заказа.Там может быть более 10 заказов и более 100 вызовов и 1000 клиентов.
Примечание2 Не удалось найти хорошее название для этого вопроса.Пожалуйста, измените его, если вы считаете, что лучше.
Edit2: Запрос, представленный в ответе, занимает слишком много времени.Общее количество записей для обновления составляет около 250000.
Спасибо.