Обрезать завершающий ди git префикса карты при наличии 0-9 цифр - PullRequest
0 голосов
/ 18 марта 2020

У меня есть некоторые записи в моей таблице, такие как:

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

Я просто проверяю, есть ли более эффективный способ сделать это, потому что наши записи становятся огромными в нашей живой среде. Также будет необходимо выполнять этот процесс чаще.

1 Ответ

2 голосов
/ 18 марта 2020

Чтение между строк, но поэтому вы не после ...

SELECT Prefix
FROM dbo.YourTable
WHERE Prefix <= 99999999 --If this is alphanumeric, use LEN, but this will come at a cost
UNION ALL
SELECT DISTINCT LEFT(Prefix,8)
FROM dbo.YourTable
WHERE Prefix > 99999999; --If this is alphanumeric, use LEN, but this will come at a cost
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...