ठीक है, सबसे पहले मैंने आपको यह दिखाने के लिए एक पंक्ति जोड़ी है कि किसी और का उत्तर कहाँ काम नहीं करता है लेकिन उन्होंने इसे अभी हटा दिया है।
अब मेरी क्वेरी में तर्क के लिए। आपने कहा था कि आप प्रत्येक पंक्ति चाहते हैं जो दूसरी पंक्ति के दो मिनट के भीतर हो। इसका मतलब है कि आपको न केवल पीछे की ओर देखना होगा, बल्कि LEAD () के साथ आगे भी देखना होगा। आपकी क्वेरी में, पिछली बार NULL होने पर आप वापस आ गए थे, इसलिए यह प्रत्येक ऑर्डर नंबर का पहला मान लौटाता है, भले ही वह सही या गलत हो। संयोग से, आपके प्रत्येक ऑर्डर नंबर के पहले मूल्यों को तब तक वापस करने की आवश्यकता होती है जब तक कि आप अंतिम ऑर्डर नंबर तक नहीं पहुंच जाते जहां यह टूट गया था। मेरी क्वेरी इसे ठीक करती है और आपके सभी डेटा के लिए काम करना चाहिए।
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
परिणाम (याद रखें मैंने एक पंक्ति जोड़ी है):
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