Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tìm khoảng thời gian bị thiếu trong bảng

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ừng DeviceID .
  • 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        



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo hồ sơ thư cơ sở dữ liệu (SSMS)

  2. Tôi có thể lưu 'Đối tượng' trong cơ sở dữ liệu SQL Server không?

  3. Cách lấy giá trị tự động tăng của hàng cuối cùng tại phần chèn

  4. .NET SqlDependency với nhiều thông báo so với bỏ phiếu tỷ lệ cao?

  5. SQL Server Tính khả dụng cao:Thêm đĩa mới vào phiên bản cụm chuyển đổi dự phòng hiện có