递归cte重复几个整数

时间:2015-07-13 12:37:20

标签: sql tsql sql-server-2012

我喜欢一列数字: 7次出现整数1次,随后7次出现2次,随后7次出现3次,接着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

7 个答案:

答案 0 :(得分:1)

无需使用recursive CTE,您可以尝试基于集合的方法解决方案尝试这样的事情。 integer师的种类。

如果您有权访问master数据库,请使用它。

;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

或使用tally table生成数字。我更喜欢这个解决方案

DECLARE @n INT = 10;

WITH Tally (num)
     AS (
        -- 1000 rows
        SELECT Row_number()OVER (ORDER BY (SELECT NULL))
         FROM   (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
                CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
                CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)),
     seq
     AS (SELECT [7_seq] = ( ( Row_number()
                                OVER(
                                  ORDER BY (SELECT num)) - 1 ) / 7 ) + 1
         FROM   Tally)
SELECT [7_seq]
FROM   seq
WHERE  [7_seq] <= @n 

答案 1 :(得分:1)

你可以在下面这样做:

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

@max变量设置为您想要达到的数字它是10所以它将返回结果集,如:

1
1
1
1
1
1
1
2
2
2
2
2
2
2
.
.
.
10
10
10
10
10
10
10

答案 2 :(得分: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

交叉连接适用于您的情况。

答案 3 :(得分:1)

<!DOCTYPE html>

<html>

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href = "<?php bloginfo(stylesheet_url); ?>" rel = "stylesheet">

</head>


<body>

    <!-- Navigation -->
    <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
        <div class="container">
            <!-- Brand and toggle get grouped for better mobile display -->
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Start Bootstrap</a>
            </div>
            <!-- Collect the nav links, forms, and other content for toggling -->
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li>
                        <a href="#about">About</a>
                    </li>
                    <li>
                        <a href="#services">Services</a>
                    </li>
                    <li>
                        <a href="#contact">Contact</a>
                    </li>
                </ul>
            </div>
            <!-- /.navbar-collapse -->
        </div>
        <!-- /.container -->
    </nav>

答案 4 :(得分:1)

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;

答案 5 :(得分:0)

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

更改@MAX的值以反映n

的值

答案 6 :(得分:0)

这是一种略有不同的方法。

sed