sql >> データベース >  >> RDS >> Sqlserver

次のクエリでオーバーラップ間隔をスキップして、1 日あたりの正確なトラック時間を取得する方法

    これは「ギャップと島」の問題です。私は自分のテストデータを偽造しました (提供しなかったため) が、うまくいくと思います。重要な直感は、同じ「島」(つまり、連続した時間間隔) 内のすべての値が、row_number() 列と同じ違いを持つということです。少し洞察が必要な場合は、IntervalsByDay から生の選択を行います cte (私が今持っているサブクエリとは対照的に);これにより、計算された島が表示されます (始点と終点を含む)。

    編集:最初の回でフィドルがあったとは思いませんでした。私の回答は、あなたのデータと望ましい出力を反映するように変更されました

    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. PostgreSQL bigserial&nextval

    2. geminstallpgはOSXLionでは機能しません

    3. PHPPDOと通常のmysql_connect

    4. MySQL:複数のテーブルにまたがる複数列の結合?