Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara melewati interval tumpang tindih dalam kueri berikut untuk mendapatkan waktu trek per hari yang akurat

Ini adalah masalah "kesenjangan dan pulau". Saya memalsukan data pengujian saya sendiri (karena Anda tidak memberikannya), tetapi saya pikir itu berhasil. Intuisi utamanya adalah bahwa semua nilai dalam "pulau" yang sama (yaitu, interval waktu yang berdekatan) akan memiliki perbedaan yang sama dari kolom row_number() . Jika Anda ingin sedikit wawasan tentangnya, lakukan pemilihan mentah dari IntervalsByDay cte (sebagai lawan dari subquery yang saya miliki sekarang); ini akan menunjukkan kepada Anda pulau yang dihitung (dengan titik awal dan akhir).

sunting:Saya tidak melihat bahwa Anda memiliki biola pada putaran pertama. Jawaban saya telah diubah untuk mencerminkan data Anda dan hasil yang diinginkan

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. Temukan, Prioritaskan, dan Selesaikan Masalah SQL Server Dalam Beberapa Menit

  2. 4 Cara untuk Mengetahui Kolom Apa yang Akan Dikembalikan oleh Prosedur Tersimpan di SQL Server

  3. Dapatkan parameter prosedur tersimpan dengan C# atau SQL?

  4. Perbarui hanya bagian Tanggal dari DateTime

  5. SQL Server - di mana sys.functions?