У меня есть некоторые записи в моей таблице, такие как:
Prefix Column
...
54664300
54664301
54664302
54664303
546643040
546643041
546643042
546643043
546643044
546643045
546643046
546643047
546643048
546643049
54664305
54664306
54664307
54664308
54664309
...
54665100
54665101
54665102
54665103
54665105
54665106
54665109
...
Если для определенного префикса завершены серии 0-9, я упрощаю их. Следующие записи выше станут:
Prefix Column
...
54664300
54664301
54664302
54664303
54664304
54664305
54664306
54664307
54664308
54664309
...
54665100
54665101
54665102
54665103
54665105
54665106
54665109
...
И я могу еще больше упростить их, потому что серия 0-9 была завершена. Что приведет к:
Prefix Column
...
5466430
...
54665100
54665101
54665102
54665103
54665105
54665106
54665109
...
Но некоторые записи не будут упрощены, потому что они неполные.
Я выполнил этот процесс, используя WHILE
l oop:
DECLARE @length INT = (SELECT MAX(LEN(CardPrefix)) FROM #Card) - 1;
IF OBJECT_ID('tempdb..#GroupedCard') IS NOT NULL DROP TABLE #GroupedCard;
CREATE TABLE #GroupedCard (CardPrefix NVARCHAR(20));
WHILE (@length > 6) -- minimum 6 digits only
BEGIN
TRUNCATE TABLE #GroupedCard;
INSERT INTO #GroupedCard
SELECT LEFT(CardPrefix, @length) CardPrefix
FROM #Card
WHERE LEN(CardPrefix) > @length
GROUP BY LEFT(CardPrefix, @length)
HAVING SUM(CAST(ISNULL(RIGHT(CardPrefix, 1), 0) AS INT)) = 45; --sum of 0 to 9 is 45
IF NOT EXISTS (SELECT 1 FROM #GroupedCard) BREAK;
DELETE #Card
FROM #Card C
INNER JOIN #GroupedCard GC ON GC.CardPrefix = LEFT(C.CardPrefix, 9);
INSERT INTO #Card
SELECT CardPrefix FROM #GroupedCard;
END
Я просто проверяю, есть ли более эффективный способ сделать это, потому что наши записи становятся огромными в нашей живой среде. Также будет необходимо выполнять этот процесс чаще.