Sql 重复几个整数的递归cte
我想要一列数字: 整数1出现7次,2出现7次,3出现7次,接着是7起n-1事件,接着是7起n事件。像这样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 =
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