生成的数列
Generated number sequence
任何人都可以帮我生成每 n 个数字重复 n 次的数字序列。看起来像这样 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 ... 不用临时表和循环就可以得到结果。
例如,我可以使用此代码获得从 1 到 1000 的简单序列
;WITH n(n) AS
(
SELECT 1
UNION ALL
SELECT n+1 FROM n WHERE n < 1000
)
SELECT n FROM n ORDER BY n
OPTION (MAXRECURSION 1000);
但是如何重组代码以获得上述序列?
对于直到 2048 的序列,您可以使用此代码(不过您可以轻松修改它以获得更多数字):
DECLARE @N INT;
SET @N = 5;
WITH Numbers AS
(
SELECT number + 1 number
FROM master.dbo.spt_values
WHERE type = 'P'
)
SELECT A.number
FROM Numbers A
CROSS JOIN Numbers B
WHERE A.number >= B.number
AND A.number <= @N
ORDER BY A.number;
Here is a demo 给你试试。
结果是:
╔════════╗
║ number ║
╠════════╣
║ 1 ║
║ 2 ║
║ 2 ║
║ 3 ║
║ 3 ║
║ 3 ║
║ 4 ║
║ 4 ║
║ 4 ║
║ 4 ║
║ 5 ║
║ 5 ║
║ 5 ║
║ 5 ║
║ 5 ║
╚════════╝
任何人都可以帮我生成每 n 个数字重复 n 次的数字序列。看起来像这样 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 ... 不用临时表和循环就可以得到结果。
例如,我可以使用此代码获得从 1 到 1000 的简单序列
;WITH n(n) AS
(
SELECT 1
UNION ALL
SELECT n+1 FROM n WHERE n < 1000
)
SELECT n FROM n ORDER BY n
OPTION (MAXRECURSION 1000);
但是如何重组代码以获得上述序列?
对于直到 2048 的序列,您可以使用此代码(不过您可以轻松修改它以获得更多数字):
DECLARE @N INT;
SET @N = 5;
WITH Numbers AS
(
SELECT number + 1 number
FROM master.dbo.spt_values
WHERE type = 'P'
)
SELECT A.number
FROM Numbers A
CROSS JOIN Numbers B
WHERE A.number >= B.number
AND A.number <= @N
ORDER BY A.number;
Here is a demo 给你试试。
结果是:
╔════════╗
║ number ║
╠════════╣
║ 1 ║
║ 2 ║
║ 2 ║
║ 3 ║
║ 3 ║
║ 3 ║
║ 4 ║
║ 4 ║
║ 4 ║
║ 4 ║
║ 5 ║
║ 5 ║
║ 5 ║
║ 5 ║
║ 5 ║
╚════════╝