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 |
+--------------+------------------+------------------+