0

start時間で記述されたタイムスパンを持つ大きなデータベース テーブルがありますstop。簡単なタイムスパンが優先され、タイムスパンが重複する可能性があります。

重複がなくなるように処理する必要があります。
オーバーラップの場合、優先度の高いスパンが優先され、優先度の低いタイムスパンがトリミングされて、2 つがオーバーラップしなくなります。タイム スパンが優先度の高い 1 つ以上のタイム スパンと完全に重複している場合は、削除する必要があります。

簡単なテーブルの例:

SELECT
    1 AS id,
    {ts '2012-09-24 10:00:00'} AS start,
    {ts '2012-09-24 11:00:00'} AS stop,
    10 AS priority
INTO #TABLE
UNION ALL SELECT 2, {ts '2012-09-24 10:15:00'}, {ts '2012-09-24 12:00:00'}, 5
UNION ALL SELECT 3, {ts '2012-09-24 10:30:00'}, {ts '2012-09-24 12:30:00'}, 1
UNION ALL SELECT 4, {ts '2012-09-24 11:30:00'}, {ts '2012-09-24 13:00:00'}, 15

SELECT * FROM #TABLE;
DROP TABLE #TABLE;

結果は次のようになります。

Start              Stop               Priority
2012-09-24 10:00   2012-09-24 11:00   10
2012-09-24 11:00   2012-09-24 11:30   5
2012-09-24 11:30   2012-09-24 13:00   15

可能ですが、簡単な解決策が見つかりません。できれば、カーソルの使用を避けたいと思います。しかし、他に方法がない場合は、まあ、カーソルです。

4

1 に答える 1

2

試す

;with cte as 
(select start as timepoint from @table union select stop from @table)
,cte2 as (select *, ROW_NUMBER() over (order by timepoint) rn from cte) 

    select id, MIN(ts) as starttime, max(te) as stoptime, maxpri
    from @table t2
        inner join
        (               
        select ts, te, MAX(priority) as maxpri 
        from @table t1
            inner join
            (       
            select c1.rn, c1.timepoint as ts, c2.timepoint as te 
            from cte2 c1
            inner join cte2 c2 on c1.rn+1 = c2.rn
            ) v
            on t1.start<v.te and t1.stop>v.ts
        group by ts, te
        ) v
            on t2.priority = v.maxpri
            and ts>=start and te<=stop
        group by id, maxpri
        order by starttime
于 2012-09-24T10:21:33.673 に答える