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

Cách bỏ qua các khoảng trùng lặp trong truy vấn sau để có được thời gian theo dõi chính xác mỗi ngày

Đây là một vấn đề "khoảng trống và đảo". Tôi đã giả mạo dữ liệu thử nghiệm của chính mình (vì bạn không cung cấp bất kỳ dữ liệu nào), nhưng tôi nghĩ nó hoạt động. Trực giác quan trọng là tất cả các giá trị trong cùng một "đảo" (tức là khoảng thời gian liền kề) sẽ có cùng sự khác biệt so với cột row_number (). Nếu bạn muốn có một chút thông tin chi tiết về nó, hãy thực hiện một lựa chọn thô từ IntervalsByDay cte (trái ngược với truy vấn con mà tôi có bây giờ); điều này sẽ hiển thị cho bạn các hòn đảo được tính toán (với điểm đầu và điểm cuối).

chỉnh sửa:Tôi không thấy rằng bạn đã gặp khó khăn trong lần đầu tiên đi vòng quanh. Câu trả lời của tôi đã được thay đổi để phản ánh dữ liệu của bạn và kết quả mong muốn

with i as (
    select datediff(minute, '2013-01-01', StartTime) as s,
        datediff(minute, '2013-01-01', EndTime) as e
    from #track
), brokenDown as (
    select distinct n.Number
    from i
    join dbadmin.dbo.Numbers as n
        on n.Number >= i.s
        and n.Number <= i.e
), brokenDownWithID as (
    select Number, Number - row_number() over(order by Number) as IslandID,
        cast(dateadd(minute, number, '2013-01-01') as date) as d
    from brokenDown
), IntervalsByDay as (
    select
        dateadd(minute, min(number), '2013-01-01') as [IntervalStart],
        dateadd(minute, max(number), '2013-01-01') as [IntervalEnd],
        d,
        max(Number) - min(Number) + 1 as [NumMinutes]
    from brokenDownWithID
    group by IslandID, d
)
select d, sum(NumMinutes) as NumMinutes
from IntervalsByDay
group by d
order by d



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL để biến một cột số thành một chuỗi

  2. Sự khác biệt giữa datetime và timestamp trong sqlserver?

  3. Tập lệnh SQL để thay đổi TẤT CẢ các phím ngoại để thêm BẬT XÓA CASCADE

  4. Lỗi:Nhà cung cấp TCP:Mã lỗi 0x2746. Trong quá trình thiết lập Sql trong linux thông qua thiết bị đầu cuối

  5. Cách hiệu quả để nhận @@ rowcount từ một truy vấn bằng cách sử dụng row_number