动态返回行数的sql查询
我有一张表格动态返回行数的sql查询,sql,sql-server,Sql,Sql Server,我有一张表格 CREATE TABLE [dbo].[table1]( [id] [bigint] IDENTITY(1,1) NOT NULL, [clientid] [int] NULL, [startdate] [int] NULL, [copyid] [int] NULL 表中数据的格式如下: id clientid startdate copyid 1 4 11 1 2 4 12 1 3 4
CREATE TABLE [dbo].[table1](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[clientid] [int] NULL,
[startdate] [int] NULL,
[copyid] [int] NULL
表中数据的格式如下:
id clientid startdate copyid
1 4 11 1
2 4 12 1
3 4 44 2
3 5 123 1
4 5 15 1
5 5 12 2
6 5 12 2
7 5 12 2
copyid是clientid的子集
我的问题是,我能否形成一个select查询,返回一个有N行的表
并且是copyid递增的clientid和copyid组合的副本
例如,如果clientid为4,copyid为1,N为6,则应该返回6行,如下所示
clientid startdate copyid
4 11 3
4 12 3
4 11 4
4 12 4
4 11 5
4 12 5
N将始终是客户端和副本组合的倍数
我知道如何使用循环来实现这一点。但是,是否可以使用单个select查询 这可以使用一个简单的光标来完成 使用您在问题中提供的示例数据,我创建了以下解决方案:
DECLARE @ClientID INT = 4
DECLARE @CopyID INT = 1
DECLARE @N INT = 6
;WITH DATA
AS (SELECT *,
Row_number ()
OVER (
ORDER BY ID) RN,
Count(*)
OVER (
PARTITION BY CLIENTID) CID
FROM (SELECT *,
Max(COPYID)
OVER (
PARTITION BY CLIENTID) MaxID,
0 AS root
FROM TABLE1)T
WHERE CLIENTID = @clientid
AND COPYID = @Copyid),
CTE
AS (SELECT *
FROM DATA
UNION ALL
SELECT t2.[ID],
t2.[CLIENTID],
t2.[STARTDATE],
t2.[COPYID],
t2.MAXID,
t2.ROOT + 1,
t2.RN + T2.CID RN,
T2.CID
FROM DATA t1
INNER JOIN CTE t2
ON t1.ID = t2.ID
WHERE t2.RN < @N - 1)
SELECT CLIENTID,
STARTDATE,
MAXID + ROOT + 1 COPYID
FROM CTE
WHERE RN <= @N
ORDER BY COPYID
可以在上找到一个工作示例 在最终结果中,列copy id的值应该是多少?您能解释一下导致输出中CopyID从3开始的逻辑吗?为什么第三行不是新输出的一部分,其中clientId=4,startdate=44,为什么日期=44???表中有两行clientId为4,CopyID为1,所以我希望查询增加copyid在evry两行之后,对于该客户端,其基本值应为maxcopyid+1。基本上,我希望客户端和副本的克隆与copyid的组合自动递增Hanks Gidil。我也在考虑使用CTE的递归查询,但由于我对CTE的掌握不是很好,所以我花了很长时间才想出一个解决方案。再次感谢