Sql 重复几个整数的递归cte

Sql 重复几个整数的递归cte,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,我想要一列数字: 整数1出现7次,2出现7次,3出现7次,接着是7起n-1事件,接着是7起n事件。像这样 Num 1 1 1 1 1 1 1 2 2 2 2 2 2 2 ... ... n-1 n-1 n-1 n-1 n-1 n-1 n-1 n n n n n n n 不幸的是,我没有取得太大的进步。我当前的尝试如下,其中n=4: WITH one AS ( SELECT num = 1, cnt =

我想要一列数字: 整数1出现7次,2出现7次,3出现7次,接着是7起n-1事件,接着是7起n事件。像这样

Num
1
1
1
1
1
1
1
2
2
2
2
2
2
2
...
...
n-1
n-1
n-1
n-1
n-1
n-1
n-1
n
n
n
n
n
n
n
不幸的是,我没有取得太大的进步。我当前的尝试如下,其中n=4:

WITH
    one AS
        (
            SELECT  num  = 1,
                    cnt  = 0
            UNION   ALL

            SELECT  num  = num, 
                    cnt  = cnt + 1
            FROM    one
            WHERE   cnt <   7               
        ),
    x AS
        (
            SELECT  num,
                    cnt  = 0
            FROM    one

            UNION   ALL
            SELECT  num  = num + 1, 
                    cnt  = cnt + 1
            FROM    one
            WHERE   cnt < 4     
        )  
SELECT  *
FROM    x
不需要使用递归CTE,您可以尝试使用基于集合的方法解决方案。一种整数除法

如果您有权访问主数据库,请使用此选项

;with cte as
(
SELECT top 1000 [7_seq] = ( ( Row_number()OVER(ORDER BY (SELECT NULL)) - 1 ) / 7 ) + 1
FROM   sys.columns 
)
select * from cte where [7_seq] <= @n

您可以通过以下方式执行此操作:

DECLARE @num INT = 1,
        @sub INT = 0,
        @max INT = 10,          
        @timesToRepeat INT = 7

CREATE TABLE #Temp (num INT)


WHILE (@num < @max + 1)
BEGIN
    SET @sub = 0;
    WHILE (@sub < @timesToRepeat)
    BEGIN
        INSERT INTO #Temp
        SELECT @num x  
        SET @sub = @sub +1
    END
    SET @num = @num +1

END

SELECT * FROM #Temp

DROP TABLE #Temp
交叉连接将在您的情况下起作用

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
),
se7en AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM se7en 
    WHERE n+1 <= 7
)
SELECT Numbers.n
FROM Numbers CROSS JOIN se7en

更改@MAX的值以反映n的值,这里有一种稍微不同的方法

select null num into #a
union all
select null
union all
select null
union all
select null
union all
select null
union all
select null
union all
select null

select * into #b from 
    (select rn = row_number()over (order by (select null)) from sys.objects A cross join sys.objects B) A
where rn <=10

select #b.rn as numbers from #a cross join #b
order by 1 

检查我的答案,这不是你需要的吗?
with x as 
(select 1 as id
 union all
 select 2 as id 
 union all
 select 3 as id 
 union all
 select 4 as id 
 union all
 select 5 as id 
 union all
 select 6 as id 
 union all
 select 7 as id)
 select x1.* from x cross join x x1
;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
),
se7en AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM se7en 
    WHERE n+1 <= 7
)
SELECT Numbers.n
FROM Numbers CROSS JOIN se7en
WITH t1 AS (SELECT 0 as num UNION ALL SELECT 0)
    ,t2 AS (SELECT 0 as num FROM t1 as a CROSS JOIN t1 as b) 
    ,t3 AS (SELECT 0 as num FROM t2 as a CROSS JOIN t2 as b) 
    ,t4 AS (SELECT 0 as num FROM t3 as a CROSS JOIN t3 as b)
    ,Tally (number) 
    AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) FROM t4)
SELECT  t1.number 
FROM Tally as t1 cross join Tally as t2 
where t2.number <=7
ORDER BY t1.number;
DECLARE @MAX INTEGER
SET @MAX = 5;
with cte as
(SELECT 7 as num
UNION ALL
SELECT num-1 as num from cte where num>1
),cte2 AS
(SELECT @MAX as num
UNION ALL
SELECT num-1 as num from cte2 where num>1)
select C2.num from cte C1,cte2 C2 ORDER by C2.num asc
select null num into #a
union all
select null
union all
select null
union all
select null
union all
select null
union all
select null
union all
select null

select * into #b from 
    (select rn = row_number()over (order by (select null)) from sys.objects A cross join sys.objects B) A
where rn <=10

select #b.rn as numbers from #a cross join #b
order by 1