Sql 基于条件的行数

Sql 基于条件的行数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的最终目标是获取每个定义的所有OPENQUERY部分 我要做的是标记OPENQUERY开始的行,然后抓取接下来的15行。它不会100%准确,但会非常接近 我希望输出如下所示: new_line_num object_name line open_query_label open_query_group 147 dbo.table_1 ,max(case when quest...) 0 148

我的最终目标是获取每个定义的所有
OPENQUERY
部分

我要做的是标记
OPENQUERY
开始的行,然后抓取接下来的15行。它不会100%准确,但会非常接近

我希望输出如下所示:

new_line_num    object_name   line            open_query_label  open_query_group
147             dbo.table_1   ,max(case when quest...)          0
148             dbo.table_1   ,max(case when quest...)          0
149             dbo.table_1   ,max(case when quest...)          0
150             dbo.table_1   ,max(case when quest...)          0
open\u query\u group
取值15后,我希望它返回到0,除非SQL语句中还有另一个
OPENQUERY
。当这种情况发生时,我希望
OPEN\u QUERY\u组
编号从1开始


关于如何操作行数函数有什么建议吗?

这里有一个部分解决方案,我不能使用您的CTE做任何事情,所以我制作了一些虚拟数据

new_line_num     object_name     line                 open_query_label          open_query_group
142              dbo.table_name  ,max(case when...                              0
153              dbo.table_name  OPENQUERY([whatever    OPENQUERY               1    
154              dbo.table_name  'select                                        2
诀窍是首先为OPENQUERY的每个实例创建一个组

我通过toing一个聚合和来实现这一点,在有OPENQUERY的地方将行值设置为1,在其他地方设置为0。这形成了一组不同的组,1 pr OPENQUERY(加上第一个OPENQUERY之前的任何内容)

这给了我们这个(部分结果)

现在我将其打包为CTE2,然后我只使用row_编号来获取组:

+--------------+------------------+-----+
| new_line_num | open_query_label | grp |
+--------------+------------------+-----+
|            1 |                  |   0 |
|            2 |                  |   0 |
|            3 | OPENQUERY        |   1 |
|            4 |                  |   1 |
|            5 |                  |   1 |
|            6 |                  |   1 |
|            7 |                  |   1 |
|            8 |                  |   1 |
|            9 |                  |   1 |
|           10 |                  |   1 |
|           11 | OPENQUERY        |   2 |
|           12 |                  |   2 |
|           13 |                  |   2 |
|           14 |                  |   2 |
+--------------+------------------+-----+
部分结果:

WITH cte
AS
(SELECT
        *
    FROM (VALUES
    (1, ''), (2, ''), (3, 'OPENQUERY'), (4, ''), (5, ''), (6, ''), (7, ''), (8, ''), (9, ''), (10, ''), (11, 'OPENQUERY')
    , (12, ''), (13, ''), (14, ''), (15, ''), (16, ''), (17, ''), (18, ''), (19, ''), (20, ''), (21, ''), (22, '')
    , (23, ''), (24, ''), (25, ''), (26, ''), (27, ''), (28, ''), (29, ''), (30, ''), (31, ''), (32, ''), (33, '')
    , (34, ''), (35, ''), (36, 'OPENQUERY'), (37, ''), (38, ''), (39, ''), (40, ''), (41, ''), (41, '')) a (new_line_num, open_query_label)),
cte2
AS
(SELECT
        new_line_num
       ,open_query_label
       ,SUM(IIF(open_query_label = 'OPENQUERY', 1, 0)) OVER (ORDER BY new_line_num) grp
    FROM cte)
SELECT
    new_line_num
   ,open_query_label
   ,ROW_NUMBER() OVER (PARTITION BY grp ORDER BY new_line_num) open_query_group
FROM cte2
最后,我们希望第一行从0开始,而不是从1开始,并且open_query_组从15滚动到0

+--------------+------------------+------------------+
| new_line_num | open_query_label | open_query_group |
+--------------+------------------+------------------+
|            1 |                  |                1 |
|            2 |                  |                2 |
|            3 | OPENQUERY        |                1 |
|            4 |                  |                2 |
|            5 |                  |                3 |
|            6 |                  |                4 |
|            7 |                  |                5 |
|            8 |                  |                6 |
|            9 |                  |                7 |
|           10 |                  |                8 |
|           11 | OPENQUERY        |                1 |
|           12 |                  |                2 |
+--------------+------------------+------------------+
这将特别处理第一个grp(0),并使用模数16使行号从15滚动到0

最终结果是:

SELECT
    new_line_num
   ,open_query_label
   ,(ROW_NUMBER() OVER (PARTITION BY grp ORDER BY new_line_num) 
    - iif(grp=0,1,0))%16
   open_query_group
FROM cte2
WITH cte
AS
(SELECT
        *
    FROM (VALUES
    (1, ''), (2, ''), (3, 'OPENQUERY'), (4, ''), (5, ''), (6, ''), (7, ''), (8, ''), (9, ''), (10, ''), (11, 'OPENQUERY')
    , (12, ''), (13, ''), (14, ''), (15, ''), (16, ''), (17, ''), (18, ''), (19, ''), (20, ''), (21, ''), (22, '')
    , (23, ''), (24, ''), (25, ''), (26, ''), (27, ''), (28, ''), (29, ''), (30, ''), (31, ''), (32, ''), (33, '')
    , (34, ''), (35, ''), (36, 'OPENQUERY'), (37, ''), (38, ''), (39, ''), (40, ''), (41, ''), (41, '')) a (new_line_num, open_query_label)),
cte2
AS
(SELECT
        new_line_num
       ,open_query_label
       ,SUM(IIF(open_query_label = 'OPENQUERY', 1, 0)) OVER (ORDER BY new_line_num) grp
    FROM cte)
SELECT
    new_line_num
   ,open_query_label
   ,ROW_NUMBER() OVER (PARTITION BY grp ORDER BY new_line_num) open_query_group
FROM cte2
+--------------+------------------+------------------+
| new_line_num | open_query_label | open_query_group |
+--------------+------------------+------------------+
|            1 |                  |                1 |
|            2 |                  |                2 |
|            3 | OPENQUERY        |                1 |
|            4 |                  |                2 |
|            5 |                  |                3 |
|            6 |                  |                4 |
|            7 |                  |                5 |
|            8 |                  |                6 |
|            9 |                  |                7 |
|           10 |                  |                8 |
|           11 | OPENQUERY        |                1 |
|           12 |                  |                2 |
+--------------+------------------+------------------+
SELECT
    new_line_num
   ,open_query_label
   ,(ROW_NUMBER() OVER (PARTITION BY grp ORDER BY new_line_num) 
    - iif(grp=0,1,0))%16
   open_query_group
FROM cte2
+--------------+------------------+------------------+
| new_line_num | open_query_label | open_query_group |
+--------------+------------------+------------------+
|            1 |                  |                0 |
|            2 |                  |                1 |
|            3 | OPENQUERY        |                1 |
|            4 |                  |                2 |
|            5 |                  |                3 |
|            6 |                  |                4 |
|            7 |                  |                5 |
|            8 |                  |                6 |
|            9 |                  |                7 |
|           10 |                  |                8 |
|           11 | OPENQUERY        |                1 |
|           12 |                  |                2 |
|           13 |                  |                3 |
|           14 |                  |                4 |
|           15 |                  |                5 |
|           16 |                  |                6 |
|           17 |                  |                7 |
|           18 |                  |                8 |
|           19 |                  |                9 |
|           20 |                  |               10 |
|           21 |                  |               11 |
|           22 |                  |               12 |
|           23 |                  |               13 |
|           24 |                  |               14 |
|           25 |                  |               15 |
|           26 |                  |                0 |
|           27 |                  |                1 |
|           28 |                  |                2 |
|           29 |                  |                3 |
|           30 |                  |                4 |
|           31 |                  |                5 |
|           32 |                  |                6 |
|           33 |                  |                7 |
|           34 |                  |                8 |
|           35 |                  |                9 |
|           36 | OPENQUERY        |                1 |
|           37 |                  |                2 |
|           38 |                  |                3 |
|           39 |                  |                4 |
|           40 |                  |                5 |
|           41 |                  |                6 |
|           41 |                  |                7 |
+--------------+------------------+------------------+