Dobra, przede wszystkim dodałem wiersz, aby pokazać, gdzie odpowiedź innej osoby nie działa, ale teraz ją usunęli.
Przejdźmy teraz do logiki w moim zapytaniu. Powiedziałeś, że chcesz, aby każdy rząd znajdował się w ciągu dwóch minut od innego rzędu. Oznacza to, że za pomocą LEAD() musisz patrzeć nie tylko wstecz, ale także w przód. W zapytaniu zwrócono, gdy poprzedni czas był NULL, więc po prostu zwróciło pierwszą wartość każdego numeru zamówienia, niezależnie od tego, czy była poprawna, czy nie. Przez przypadek, pierwsze wartości każdego z Twoich numerów zamówień musiały zostać zwrócone, dopóki nie dojdziesz do ostatniego numeru zamówienia, w którym się zepsuł. Moje zapytanie to poprawia i powinno działać dla wszystkich Twoich danych.
CREATE TABLE [Order]
(
OrderNumber VARCHAR(20) NOT NULL
, OrderDateTime DATETIME NOT NULL
);
INSERT [Order] (OrderNumber, OrderDateTime)
VALUES
('1234', '2012-04-28 09:00:00'),
('1234', '2012-04-28 09:01:00'),
('1234', '2012-04-28 09:03:00'),
('5678', '2012-04-28 09:40:00'),
('5678', '2012-04-28 09:42:00'),
('5678', '2012-04-28 09:44:00'),
('91011', '2012-04-28 10:00:00'),
('91011', '2012-04-28 10:25:00'),
('91011', '2012-04-28 10:27:00');
with Ordered as (
select
OrderNumber,
OrderDateTime,
LAG(OrderDateTime,1) over (
partition by OrderNumber
order by OrderDateTime
) as prev_time,
LEAD(OrderDateTime,1) over (
partition by OrderNumber
order by OrderDateTime
) as next_time
from [Order]
)
SELECT OrderNumber,
OrderDateTime
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
Wyniki (pamiętaj, że dodałem wiersz):
OrderNumber OrderDateTime
-------------------- -----------------------
1234 2012-04-28 09:00:00.000
1234 2012-04-28 09:01:00.000
1234 2012-04-28 09:03:00.000
5678 2012-04-28 09:40:00.000
5678 2012-04-28 09:42:00.000
5678 2012-04-28 09:44:00.000
91011 2012-04-28 10:25:00.000
91011 2012-04-28 10:27:00.000