Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL server中按优先级裁剪重叠的时间跨度_Sql Server_Timespan_Gaps And Islands - Fatal编程技术网

Sql server 在SQL server中按优先级裁剪重叠的时间跨度

Sql server 在SQL server中按优先级裁剪重叠的时间跨度,sql-server,timespan,gaps-and-islands,Sql Server,Timespan,Gaps And Islands,我有一个很大的数据库表,其中包含由开始和停止时间描述的时间跨度。Easy timespan具有优先级,并且时间跨度可能相互重叠 我需要对其进行处理,以便消除重叠。 在重叠的情况下,优先级较高的时间跨度将优先,优先级较低的时间跨度将被裁剪,以便两者不重叠。 如果一个时间跨度被一个或多个具有较高优先级的时间跨度完全重叠,则应将其删除 一个简单的示例表: SELECT 1 AS id, {ts '2012-09-24 10:00:00'} AS start, {ts '2012

我有一个很大的数据库表,其中包含由开始和停止时间描述的时间跨度。Easy timespan具有优先级,并且时间跨度可能相互重叠

我需要对其进行处理,以便消除重叠。 在重叠的情况下,优先级较高的时间跨度将优先,优先级较低的时间跨度将被裁剪,以便两者不重叠。 如果一个时间跨度被一个或多个具有较高优先级的时间跨度完全重叠,则应将其删除

一个简单的示例表:

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
这是可能的,但我找不到任何简单的解决办法。我最好避免使用游标。但如果没有其他方法,那么,游标就是了。

试试看

;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

我想你明白了。但是,当前代码未返回预期结果。行id=2将被删除,而不是裁剪为时间戳11:00-11:30,在该时间戳中,其他更高优先级的时间跨度都不重叠。我会分析你的代码,看看它是否正确。@ANisus你确定吗?我得到了10:00-11:00 10,11:00-11:30 5,11:30-13:00 15的预期?是吗?好的,我再试一次。哎呀!可以我的错误。我的输入数据有错误。伟大的感谢您提供了一个很好的工作解决方案!