SQL - 生成"缺少行"选择

时间:2016-04-29 11:28:17

标签: sql sql-server

这个问题与SQL 2012有关 - 假设我有3行生成如下:

Start Position = 10
End Position = 13
Value = 100

Start position = 14
End Position = 14
Value = 250

Start Position = 15
End Position = 25
Value = 300

在3行.. 有没有办法可以强制SQL写输出:

10 - 100
11 - 100
12 - 100
13 - 100
14 - 250
15 - 300
16 - 300

等等等等

一直绞尽脑汁但却无法轻松搞定

非常感谢

Ĵ

3 个答案:

答案 0 :(得分:0)

您可以使用递归CTE或数字表执行此操作。假设差距不超过几百或几千:

with n as (
      select row_number() over (order by (select null)) - 1 as n
      from master.spt_values
     )
select (t.startpos + n.n) as position, value
from t join
     n
     on t.startpos + n.n <= t.endpos;

答案 1 :(得分:0)

没有数据表,没有数据库是完整的!关于如何创建一个的说明遍布网络,这是一个例子:

Create a numbers table

我的数据库中有一个数字表,名为 t_numbers ,它有一个单独的列“n”,每个数字的行从1开始。它上升到999,999,但它占用了磁盘空间很小。一旦你有了这个,你可以这样写:

设置一些数据首先使用

    declare @Rows table
    (
        StartPos int,
        EndPos int,
        Value int
    )

    insert into @Rows values (10, 13, 100), (14, 14, 250), (15, 25, 300)

如果您不希望空值的间隙使用内部联接

    select n.n, Value
        from t_numbers n
            inner join @Rows r on n.n >= StartPos and n.n <= EndPos

如果你想要差距然后离开加入,但用where子句限制回报

    select n.n, Value
        from t_numbers n
            left join @Rows r on n.n >= StartPos and n.n <= EndPos
        where n <= (select MAX(EndPos) from @Rows)

答案 2 :(得分:0)

谢谢你们!这样做了

最后我创建了一个数字表(谢谢你们) +说

CROSS JOIN MyNumbers

在T.triangle_start_position和T.triangle_end_position之间的T.Real_Position

这给了我正在寻找的确切结果集