Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在日期差异上获取同一FK的前一条记录_Sql_Sql Server 2005_Tsql - Fatal编程技术网

Sql 在日期差异上获取同一FK的前一条记录

Sql 在日期差异上获取同一FK的前一条记录,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,我需要在一小时内插入同一客户的top 1记录。如果记录在一小时后插入,则不需要该记录。 请参见下表。这只是1000条记录的样本。我正在使用SQLServer2005 按订单日期订购 注意,我在这里使用了一个子查询,首先对customerid进行过滤,以便获得更好的性能。考虑到下表,应尽量避免在限制子句中对大型日期集使用函数DATEDIFF: CREATE TABLE [dbo].[Orders]( [OrderID] [int] IDENTITY(1,1) NOT NULL, [

我需要在一小时内插入同一客户的top 1记录。如果记录在一小时后插入,则不需要该记录。 请参见下表。这只是1000条记录的样本。我正在使用SQLServer2005

按订单日期订购


注意,我在这里使用了一个子查询,首先对customerid进行过滤,以便获得更好的性能。考虑到下表,应尽量避免在限制子句中对大型日期集使用函数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语句将表中的订单限制为基于当前系统日期在最后一小时内下的订单,并按订单日期进行订单。 第一条语句选择“first”,然后按客户提取第一批订单。 第二条语句选择“second”,然后提取第一条语句中没有的所有其他顺序

这应该和你预期的一样,穆罕默德,但是我没有1000行来测试这一点。性能应该可以,因为With部件将创建一个临时表来使用。

想法如下

选择一小时内的所有子订单及其可能的最小父ID。我在这里假设最低的OrderID也将是最早的OrderID。 将这些结果与原始表联接。 将这些结果用作update语句的基础。 SQL语句


如果您的浏览器/代理拒绝显示第三方内容,则以图像为例可以解答您的问题。不显示文本表有什么原因吗?非常感谢您提到这一点,未经许可。在图像中显示问题并没有特别的原因。我以后会处理的。非常感谢@Lieven。你真是太好了。我看过你的个人资料照片。我想你和你的家人在一起。好照片。
;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
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