Việc theo dõi sẽ hoạt động và không chỉ trả về một bản ghi duy nhất cho một deviceid.
Ý chính của việc này là để
- Thêm một rownumber vào mỗi bản ghi, được sắp xếp theo
Date
và khởi động lại cho từngDeviceID
. - Kết hợp với self để tạo kết quả với các hàng bao gồm sự kết hợp của hai hàng ban đầu. Mối quan hệ giữa các cột của mỗi hàng là rownumber (+1) và
DeviceID
. - Chỉ giữ lại những hàng có
Date
có liên quan hơn 15 phút.
Câu lệnh SQL
;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
Tập lệnh thử nghiệm
;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