sql >> Databáze >  >> RDS >> Sqlserver

Jak přeskočit intervaly překrývání v následujícím dotazu, abyste získali přesný čas sledování za den

Toto je problém „mezery a ostrovy“. Zfalšoval jsem svá vlastní testovací data (protože jste žádná neposkytli), ale myslím, že to funguje. Klíčovou intuicí je, že všechny hodnoty v rámci stejného „ostrova“ (tj. souvislého časového intervalu) budou mít stejný rozdíl od sloupce row_number(). Pokud o tom chcete trochu nahlédnout, udělejte si hrubý výběr z IntervalsByDay cte (na rozdíl od poddotazu, který mám nyní); toto vám ukáže vypočítané ostrovy (s počátečním a koncovým bodem).

edit:Neviděl jsem, že jsi měl housle hned při prvním průchodu. Moje odpověď byla změněna tak, aby odrážela vaše data a požadovaný výstup

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. Vyberte řádek s maximální hodnotou v jednom sloupci

  2. Jak vložit data formuláře do databázové tabulky MySQL pomocí PHP a Ajaxu?

  3. com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Po uzavření připojení nejsou povoleny žádné operace

  4. Pravidla PostgreSQL a nextval()/sériový problém (velmi specifické pro PostgreSQL)