【问题标题】:Get top one record of same FK on date difference在日期差异上获得相同 FK 的前一条记录
【发布时间】:2010-02-25 22:37:55
【问题描述】:

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

alt text http://img651.imageshack.us/img651/3990/customershavingmultiple.png

【问题讨论】:

  • 如果您的浏览器/代理拒绝显示第 3 方内容,则使用图像作为示例会破坏您的问题。是否有不显示文本表的原因?
  • 非常感谢您提到这一点,Unsliced。在图像中显示问题没有特别的原因。以后我会处理的。

标签: sql sql-server-2005 tsql


【解决方案1】:

思路如下

  • 在一小时内选择所有订单及其最小可能的(父)ID。 (我在这里假设最低的 OrderID 也是 最旧的 OrderID)。
  • 将这些结果与原始表格相结合。
  • 使用这些结果作为更新语句的基础。

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

【讨论】:

  • 非常感谢@Lieven。你真是太好了。我看过你的头像。我想你和你的家人在一起。很棒的照片。
【解决方案2】:

考虑下表:

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 部分会创建一个临时表来使用。

【讨论】:

    【解决方案3】:
    select Top 1 * 
    from (select orderid, customerid, orderdate, parentorderid from customer where customerid=@customerid)
    where DATEDIFF(mi, orderdate, GETDATE()) > 60
    

    按订单日期排序

    注意我在这里使用了一个子查询来首先过滤 customerid,以便获得更好的性能。您应该尽量避免在限制子句中对大量日期使用函数(DATEDIFF)

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      相关资源
      最近更新 更多