sql >> Database >  >> RDS >> Sqlserver

Hoe u overlap-intervallen in de volgende query kunt overslaan om de juiste tracktijd per dag te krijgen

Dit is een probleem van "gaten en eilanden". Ik heb mijn eigen testgegevens vervalst (omdat je er geen hebt verstrekt), maar ik denk dat het werkt. De belangrijkste intuïtie is dat alle waarden binnen hetzelfde "eiland" (dat wil zeggen een aaneengesloten tijdsinterval) hetzelfde verschil hebben met een rij_nummer() kolom. Als je er een beetje inzicht in wilt hebben, maak dan een ruwe selectie uit de IntervalsByDay cte (in tegenstelling tot de subquery die ik nu heb); dit toont u de berekende eilanden (met begin- en eindpunten).

edit:ik had niet gezien dat je de eerste keer een viool had. Mijn antwoord is gewijzigd om uw gegevens en gewenste output weer te geven

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. Een voorwaardelijke UPDATE-instructie gebruiken in SQL

  2. SQL:AVG met NULL-waarden

  3. Verbind MySQL via localhost werkt niet maar 127.0.0.1 werkt wel

  4. Aangrenzende lijst naar JSON-grafiek met Postgres