sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man hoppar över överlappningsintervall i följande fråga för att få exakt spårtid per dag

Detta är ett "luckor och öar"-problem. Jag fejkade mina egna testdata (eftersom du inte angav några), men jag tror att det fungerar. Nyckelintuitionen är att alla värden inom samma "ö" (det vill säga sammanhängande tidsintervall) kommer att ha samma skillnad från en row_number() kolumn. Om du vill ha en liten inblick i det, gör ett råval från IntervalsByDay cte (i motsats till underfrågan jag har nu); detta visar dig de beräknade öarna (med start- och slutpunkter).

edit:Jag såg inte att du hade en fiol första gången. Mitt svar har ändrats för att återspegla dina uppgifter och önskat resultat

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. Monitoring Galera Cluster för MySQL eller MariaDB - Understanding Metrics (Uppdaterad)

  2. PÅ DUBLIKATKEY + AUTO ÖKNING utfärda mysql

  3. Procentandelar i MySQL

  4. Hur skapar jag SQL-synonym eller alias för databasnamn?