Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 server 用户的SQL Server筛选器项_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 用户的SQL Server筛选器项

Sql server 用户的SQL Server筛选器项,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个order表和一个orderItem表。我想得到一个用户的订单,这是下少于或 他们和拥有相同产品的人之间的时间等于2分钟产品数量必须匹配且与 他们 基于此,我能够成功地过滤出使用SQL FIDLE放置的顺序,我想出了这个 with Ordered as ( select OrderNumber, OrderDateTime, UserId, LAG(OrderDateTime,1) over ( partition by UserId

我有一个order表和一个orderItem表。我想得到一个用户的订单,这是下少于或 他们和拥有相同产品的人之间的时间等于2分钟产品数量必须匹配且与 他们


基于此,我能够成功地过滤出使用SQL FIDLE放置的顺序,我想出了这个

with Ordered as (
  select
    OrderNumber,
    OrderDateTime,
    UserId,
    LAG(OrderDateTime,1) over (
      partition by UserId
      order by OrderDateTime
    ) as prev_time,
    LEAD(OrderDateTime,1) over (
      partition by UserId
      order by OrderDateTime
    ) as next_time,
    LAG(OrderNumber,1) over (
      partition by UserId
      order by OrderDateTime
    ) as prev_OrderNumber,
    LEAD(OrderNumber,1) over (
      partition by UserId
      order by OrderDateTime
    ) as next_OrderNumber
  from [Order]
),
PossibleDuplicateOrders as (
  SELECT  OrderNumber,
          OrderDateTime,
          UserId,
          CASE 
            WHEN DATEDIFF(MINUTE,OrderDateTime,next_time) <= 2 THEN next_OrderNumber
            WHEN DATEDIFF(MINUTE,prev_time,OrderDateTime) <= 2 THEN prev_OrderNumber
            ELSE null
          END as DuplicateOrderNumber
  FROM Ordered
  WHERE   DATEDIFF(MINUTE,OrderDateTime,next_time) <= 2  --this says if the next value is less than or equal to two minutes away return it
          OR DATEDIFF(MINUTE,prev_time,OrderDateTime) <= 2 --this says if the prev value is less than or equal to 2 minutes away return it
)
select * 
  from  PossibleDuplicateOrders PDO
  where NOT EXISTS (
      SELECT *
      FROM   Order_Item OI_Left
      LEFT JOIN Order_Item OI_Right 
             ON OI_Right.OrderNumber = PDO.DuplicateOrderNumber 
            AND OI_Right.ProductID = OI_Left.ProductID
      WHERE  OI_Left.OrderNumber = PDO.OrderNumber
      AND    OI_Right.ProductID is NULL
    )
  and NOT EXISTS (
      SELECT *
      FROM   Order_Item OI_Left
      LEFT JOIN Order_Item OI_Right 
             ON OI_Right.OrderNumber = PDO.OrderNumber 
            AND OI_Right.ProductID = OI_Left.ProductID
      WHERE  OI_Left.OrderNumber = PDO.DuplicateOrderNumber
      AND    OI_Right.ProductID is NULL
    )

据我所见,根据贵方的标准,只有4444和5555号订单应被视为重复订单。在2分钟内,彼此之间有匹配的项目。您的SQL FIDLE没有包含数量,因此我没有在查询中包含数量,但如果需要,您可以添加数量。

嘿,非常感谢您的回答,我希望将4444和5555放在两个单独的行中,我不关心duplicateOrderNumber列。这可能吗?问题是知道要加入的订单号。我的建议是从这个查询中获取结果,然后选择与DuplicateOrderNumber列联合的OrderNumber列,或者取消对结果的IVOT。
with Ordered as (
  select
    OrderNumber,
    OrderDateTime,
    UserId,
    LAG(OrderDateTime,1) over (
      partition by UserId
      order by OrderDateTime
    ) as prev_time,
    LEAD(OrderDateTime,1) over (
      partition by UserId
      order by OrderDateTime
    ) as next_time,
    LAG(OrderNumber,1) over (
      partition by UserId
      order by OrderDateTime
    ) as prev_OrderNumber,
    LEAD(OrderNumber,1) over (
      partition by UserId
      order by OrderDateTime
    ) as next_OrderNumber
  from [Order]
),
PossibleDuplicateOrders as (
  SELECT  OrderNumber,
          OrderDateTime,
          UserId,
          CASE 
            WHEN DATEDIFF(MINUTE,OrderDateTime,next_time) <= 2 THEN next_OrderNumber
            WHEN DATEDIFF(MINUTE,prev_time,OrderDateTime) <= 2 THEN prev_OrderNumber
            ELSE null
          END as DuplicateOrderNumber
  FROM Ordered
  WHERE   DATEDIFF(MINUTE,OrderDateTime,next_time) <= 2  --this says if the next value is less than or equal to two minutes away return it
          OR DATEDIFF(MINUTE,prev_time,OrderDateTime) <= 2 --this says if the prev value is less than or equal to 2 minutes away return it
)
select * 
  from  PossibleDuplicateOrders PDO
  where NOT EXISTS (
      SELECT *
      FROM   Order_Item OI_Left
      LEFT JOIN Order_Item OI_Right 
             ON OI_Right.OrderNumber = PDO.DuplicateOrderNumber 
            AND OI_Right.ProductID = OI_Left.ProductID
      WHERE  OI_Left.OrderNumber = PDO.OrderNumber
      AND    OI_Right.ProductID is NULL
    )
  and NOT EXISTS (
      SELECT *
      FROM   Order_Item OI_Left
      LEFT JOIN Order_Item OI_Right 
             ON OI_Right.OrderNumber = PDO.OrderNumber 
            AND OI_Right.ProductID = OI_Left.ProductID
      WHERE  OI_Left.OrderNumber = PDO.DuplicateOrderNumber
      AND    OI_Right.ProductID is NULL
    )