T-SQL确定“乱序”记录

时间:2014-04-17 09:47:03

标签: sql sql-server tsql

我正在使用Microsoft SQL服务器,我需要确定表中“不按顺序”的记录。

我将通过一个例子来解释。 我有以下表结构:

OrderNumber OrderStatus EventDateTime
0001522989  22          2014-04-14 05:49:25.4414243
0001522989  26          2014-04-14 05:51:16.7047485
0001522989  23          2014-04-14 05:51:17.8602798
0001522990  23          2014-04-14 05:51:19.9603575
0001522990  24          2014-04-14 05:52:06.5803494
0001522990  24          2014-04-14 05:52:06.5803494

现在我需要生成一个“乱序”发送的OrderNumbers列表。 因此,在此示例中,列表将只包含一个值:“0001522989”。

订单0001522990以正确的顺序发送(第一个状态23,然后是状态24,然后是状态24(这不算作“不按顺序”))。

未按正确顺序发送订单0001522989(第一个状态22,然后是状态26,然后是状态23)。

关于如何实现这一目标的任何想法?

提前致谢。

编辑我添加了一个订单的可能性,连续两次发送相同的状态(这不应该算作“不按顺序”)

祝你好运

2 个答案:

答案 0 :(得分:5)

在SQL Server 2008之后......

SELECT
  OrderNumber
FROM
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY OrderNumber ORDER BY OrderStatus, EventDateTime  )   AS sequenceCorrect,
    ROW_NUMBER() OVER (PARTITION BY OrderNumber ORDER BY              EventDateTime)   AS sequenceActual
  FROM
    yourTable
)
  AS yourTableSequenced
WHERE
  sequenceCorrect <> sequenceActual
GROUP BY
  OrderNumber
ORDER BY
  OrderNumber


编辑:哎呀,我忘记了WHERE条款,现在应该工作了;)

答案 1 :(得分:0)

如果问题归结为:

  

查找状态编号较低且日期较高的所有发票编号

你可以这样做:

select OrderNumber 
from Orders o1
where exists (select * from Orders o2 
              where o2.OrderNumber = o1.OrderNumber
                and o2.OrderStatus >= o1.OrderStatus 
                and o2.EventDateTime < o1.EventDateTime)