考虑下表:
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 语句将表格中的订单限制为根据当前系统日期在最后一小时内下达的订单,并按订单日期对其进行排序。
然后,第一个语句(Select 'First')仅提取客户的第一个订单。
第二个语句(Select 'Second')然后提取不在第一个语句中的所有其他订单。
这应该可以按您的预期工作,Muhammed,但是我没有 1000 行来测试它。性能应该没问题,因为 With 部分会创建一个临时表来使用。