Учитывая следующую таблицу:
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 ограничивает заказы из таблицы теми, которые были размещены в течение последнего часа на основе текущей системной даты, и заказывает их по дате заказа.
Первый оператор (выберите «Первый») затем извлекает только первые заказы клиента.
Затем второй оператор (выберите «Второй») извлекает все остальные ордера, которых нет в первом операторе.
Это должно сработать, как вы и ожидали, Мухаммед, однако у меня нет 1000 строк, чтобы проверить это. Производительность должна быть в порядке, так как часть With создаст временную таблицу для работы.