Я должен стать лучшим 1 запись от того же клиента, введенного в течение одного часа. Если запись вставляется после одного часа затем не нуждаются в том. См. следующую таблицу. Это - просто образец 1000-х записей. Я использую SQL Server 2005.
сопроводительный текст http://img651.imageshack.us/img651/3990/customershavingmultiple.png
Идея заключается в следующем.
Оператор SQL
UPDATE Orders
SET ParentOrderID = p.ParentOrderID
FROM Orders o
INNER JOIN (
SELECT ParentOrderID = MIN(o1.OrderID), OrderID = o2.OrderID
FROM Orders o1
LEFT OUTER JOIN Orders o2 ON
o2.CustomerID = o1.CustomerID
AND o2.OrderDate > o1.OrderDate
AND DATEADD(hh, -1, o2.OrderDate) < o1.OrderDate
GROUP BY o2.OrderID
) p ON p.OrderID = o.OrderID
select Top 1 *
from (select orderid, customerid, orderdate, parentorderid from customer where customerid=@customerid)
where DATEDIFF(mi, orderdate, GETDATE()) > 60
order by orderdate
Примечание. Я использовал здесь подзапрос, чтобы сначала отфильтровать пользовательский идентификатор, чтобы повысить производительность. Вам следует избегать использования функций (DATEDIFF) в ограничительном предложении для больших наборов дат
Учитывая следующую таблицу:
CREATE TABLE [dbo].[Orders](
[OrderID] [int] IDENTITY(1,1) NOT NULL,
[CustomerID] [int] NULL,
[OrderDate] [datetime] NULL,
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[OrderID] ASC
)
)
следующее утверждение показывает последний заказ, размещенный клиентом в течение указанного периода времени, за которым следуют другие заказы.
;With OrderList As
(
Select Top 100 Percent * From dbo.Orders
Where OrderDate >= DateAdd(hh, -1, GetDate())
Order By OrderDate Desc
)
Select 'First' As DataType,
CustomerID, Min(OrderID) As OrderID, Min(OrderDate) As OrderDate
From OrderList
Group By CustomerID
Union All
Select 'Second' As DataType,
CustomerID, OrderID, OrderDate
From OrderList
Where OrderID Not In
(
Select Min(OrderID) As OrderID
From OrderList
Group By CustomerID
)
--Union All
--Select 'Raw' As DataType,
-- CustomerID, OrderID, OrderDate
--From Orders
Последняя часть закомментирована, поскольку я использовал ее, чтобы проверить, действительно ли я получил правильные строки.
Короче говоря, оператор With ограничивает заказы из таблицы теми, которые были размещены в течение последнего часа на основе текущей системной даты, и упорядочивает их по дате заказа. Первый оператор (выберите «Первый»), затем извлекает только первые заказы клиента. Второй оператор (выберите «Второй») затем извлекает все остальные заказы, которых нет в первом операторе.
Это должно сработать, как вы и ожидали, Мухаммед, однако у меня нет тысяч строк, чтобы проверить это. Производительность должна быть в порядке, поскольку часть With создаст временную таблицу для работы.