加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 数据库 > MsSql > 正文

T-SQL查询 – 没有游标的行迭代

发布时间:2020-05-24 10:02:24 所属栏目:MsSql 来源:互联网
导读:我有一张桌子 T (variable_name, start_no, end_no) 具有如下值的值: (x, 10, 20)(x, 30, 50)(x, 60, 70)(y, 1, 3)(y, 7, 8) 所有间隔都保证不相交. 我想在T-SQL中编写一个查询来计算未搜索变量的间隔: (x, 21, 29)(x, 51, 59)(y, 4, 6) 我可以不用光标吗?

我有一张桌子

T (variable_name,start_no,end_no)

具有如下值的值:

(x,10,20)
(x,30,50)
(x,60,70)
(y,1,3)
(y,7,8)

所有间隔都保证不相交.

我想在T-SQL中编写一个查询来计算未搜索变量的间隔:

(x,21,29)
(x,51,59)
(y,4,6)

我可以不用光标吗?

我正在考虑通过variable_name进行分区,然后按start_no进行排序.但接下来该怎么办呢?给定行集中的当前行,如何访问“下一行”?

解决方法

由于您没有指定哪个版本的SQL Server,我有多个解决方案.如果你还在摇晃SQL Server 2005,那么Giorgi’s很好地使用了CROSS APPLY.

注意:对于这两种解决方案,我使用where子句来过滤掉不正确的值,因此即使数据错误且行重叠,它也会忽略这些值.

我的桌子版本

DECLARE @T TABLE (variable_name CHAR,start_no INT,end_no INT) 
INSERT INTO @T
VALUES  ('x',20),('x',50),70),('y',3),8);

SQL Server 2012及更高版本的解决方案

SELECT *
FROM
(
    SELECT  variable_name,LAG(end_no,1) OVER (PARTITION BY variable_name ORDER BY start_no) + 1 AS start_range,start_no - 1 AS end_range
    FROM @T
) A
WHERE end_range > start_range

SQL 2008及更高版本的解决方案

WITH CTE
AS
(
    SELECT  ROW_NUMBER() OVER (PARTITION BY variable_name ORDER BY start_no) row_num,*
    FROM @T
)

SELECT  A.variable_name,B.end_no + 1 AS start_range,A.start_no - 1 AS end_range
FROM CTE AS A
INNER JOIN CTE AS B
ON      A.variable_name = B.variable_name
    AND A.row_num = B.row_num + 1
WHERE A.start_no - 1 /*end_range*/ > B.end_no + 1 /*start_range*/

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读