sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan springer du overlapningsintervaller over i den følgende forespørgsel for at få den nøjagtige sportid pr. dag

Dette er et "huller og øer"-problem. Jeg forfalskede mine egne testdata (da du ikke har givet nogen), men jeg tror, ​​det virker. Nøgleintuitionen er, at alle værdier inden for den samme "ø" (det vil sige sammenhængende tidsinterval) vil have den samme forskel fra en row_number() kolonne. Hvis du vil have et lille indblik i det, så lav et råvalg fra IntervalsByDay cte (i modsætning til den underforespørgsel, jeg har nu); dette vil vise dig de beregnede øer (med start- og slutpunkter).

edit:Jeg så ikke, at du havde en violin i første omgang. Mit svar er blevet ændret for at afspejle dine data og ønskede output

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. Måder at vide, hvordan man håndterer databasekorruption i SQL Server

  2. SQL-forespørgsel på rownum

  3. Sådan forbedres rækkefølge efter ydeevne med joins i mysql

  4. Backup Best Practices for MySQL, MariaDB og Galera Cluster