22,210
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE #A(
[LENGTH] INT
)
INSERT INTO #A VALUES (860),(400),(1510),(2300),(870),(1080),(700)
;
WITH ct1 AS
(SELECT *,CONVERT(VARCHAR(MAX),ROW_NUMBER() OVER (ORDER BY LENGTH DESC)) AS ID FROM #A),
ct AS
(SELECT * ,[LENGTH] AS SUMLEN,CONVERT(VARCHAR(max),ID) AS RESULT FROM ct1 WHERE [LENGTH]<=3000
UNION ALL
SELECT b.*,B.LENGTH+a.SUMLEN,A.RESULT+','+b.id FROM ct a INNER JOIN CT1 b ON b.id >= a.id AND a.SUMLEN+b.LENGTH<=3000
AND CHARINDEX(b.id,RESULT)=0
),
ct2 AS
(SELECT RESULT,SUMLEN,ROW_NUMBER() OVER(ORDER BY SUMLEN DESC) ID1 FROM ct),
CT3 AS
(SELECT TOP 1 *,A.RESULT RES FROM CT2 A ORDER BY A.SUMLEN DESC
UNION ALL
SELECT A.*,
CASE WHEN EXISTS(SELECT 1 FROM XXSPLIT(A.RESULT,',') AA INNER JOIN XXSPLIT(B.RES,',') BB ON AA.VALUE = BB.VALUE)
THEN B.RES
ELSE A.RESULT+','+B.RES
END
FROM CT2 A,CT3 B WHERE A.ID1=B.ID1+1
)
SELECT XX.RESULT,SUMLEN FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY RES ORDER BY SUMLEN DESC) ID2 FROM CT3) XX WHERE XX.ID2 = 1
DROP TABLE #A
参考了RINK_1和雨夹雪两位大佬的代码
那个xxsplit()就是string_split(),我的版本没有那个函数
create function xxsplit(@sql varchar(MAX),@xx varchar(20))
returns @temp table(value varchar(20))
as
begin
declare @i int
set @i=charindex(@xx,@sql)
while @i>=1
begin
insert @temp values(left(@sql,@i-1))
set @sql=substring(@sql,@i+1,len(@sql)-@i)
set @i=charindex(@xx,@sql)
end
insert into @temp values(@sql)
return
end
WITH CTE_1
AS
(SELECT *,ROW_NUMBER() OVER (ORDER BY LENGTH) AS ID FROM #T),
CTE_2
AS
(SELECT *,CAST(ID AS VARCHAR) AS ID_GROUP,LENGTH AS SUBTOTAL FROM CTE_1
UNION ALL
SELECT A.*,CAST(B.ID_GROUP+','+CAST(A.ID AS VARCHAR) AS VARCHAR),A.LENGTH+B.SUBTOTAL
FROM CTE_1 AS A
JOIN CTE_2 AS B ON A.ID>B.ID
WHERE A.LENGTH+B.SUBTOTAL<=3000)
SELECT * INTO #A FROM CTE_2
SELECT *,ROW_NUMBER() OVER (ORDER BY LENGTH) AS ID INTO #B FROM #T
SELECT * INTO #C FROM #A WHERE 1=0
WHILE EXISTS (SELECT 1 FROM #A)
BEGIN
INSERT INTO #C
SELECT TOP 1 A.*
FROM #A AS A
JOIN #B AS B ON ','+A.ID_GROUP+',' LIKE '%,'+CAST(B.ID AS VARCHAR)+',%'
ORDER BY A.SUBTOTAL DESC
DELETE #A
FROM #A AS A
JOIN #B AS B ON ','+A.ID_GROUP+',' LIKE '%,'+CAST(B.ID AS VARCHAR)+',%'
WHERE EXISTS (SELECT 1 FROM #C WHERE ','+ID_GROUP+',' LIKE '%,'+CAST(B.ID AS VARCHAR)+',%')
END
SELECT * FROM #C
DROP TABLE #A
DROP TABLE #B
DROP TABLE #C