निम्नलिखित को काम करना चाहिए और डिवाइसिड के लिए केवल एक रिकॉर्ड नहीं लौटाना चाहिए।
इसका सार यह है कि
- प्रत्येक रिकॉर्ड में एक पंक्ति संख्या जोड़ें, जो
Date
के अनुसार क्रमित हो और प्रत्येकDeviceID
. के लिए पुनः प्रारंभ करना । - दो मूल पंक्तियों के संयोजन वाली पंक्तियों के साथ परिणाम बनाने के लिए स्वयं के साथ जुड़ें। प्रत्येक पंक्ति के स्तंभों के बीच का संबंध पंक्ति संख्या (+1) और
DeviceID
है । - केवल उन्हीं पंक्तियों को बनाए रखें जहां संबंधित
Date
15 मिनट से अधिक है।
एसक्यूएल स्टेटमेंट
;WITH t AS (
SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
FROM TestTable
)
SELECT t1.DeviceID, t1.Date, t2.Date
FROM t t1
INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
WHERE DATEDIFF(MINUTE, t1.Date, t2.Date) > 15
परीक्षण स्क्रिप्ट
;WITH TestTable (ID, DeviceID, Date, Value) AS (
SELECT 1, 3, '2011-08-24 00:00:00', 0.51 UNION ALL
SELECT 2, 3, '2011-08-24 00:15:00', 2.9 UNION ALL
SELECT 3, 3, '2011-08-24 00:30:00', 0 UNION ALL
SELECT 4, 3, '2011-08-24 00:45:00', 7.1 UNION ALL
SELECT 5, 3, '2011-08-24 01:00:00', 1.05 UNION ALL
SELECT 6, 3, '2011-08-24 03:15:00', 3.8
)
, t AS (
SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
FROM TestTable
)
SELECT t1.DeviceID, t1.Date, t2.Date
FROM t t1
INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
WHERE DATEDIFF(MINUTE, t1.Date, t2.Date) > 15