SQL логическое сжатие записей - PullRequest
1 голос
/ 10 марта 2011

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

если таблица содержит все 10 возможных последних цифр (от 0 до 9) для числа (например, 252637 в следующем примере), мы найдем наиболее часто используемый источник (в нашем примере «A»), а затем удалим все цифры, где находится источник = 'A' и вставьте свернутую цифру вместо этой (здесь 252637). приведенный ниже пример поможет лучше понять.

Оригинальный стол:

Digit(bigint)| Source
             | 
2526370      | A
2526371      | A
2526372      | A
2526373      | B
2526374      | C
2526375      | A
2526376      | B
2526377      | A
2526378      | B
2526379      | B

Сжатый результат:

252637       |A
2526373      |B
2526374      |C
2526376      |B
2526378      |B
2526379      |B

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

Это просто еще одна версия принятого ответа Тома Моргана. Он использует деление вместо подстроки, чтобы обрезать младшую значащую цифру в столбце BIGINT digit:

SELECT     
    t.Digit/10      
    (
        -- Foreach t, get the Source character that is most abundant (statistical mode).
        SELECT TOP 1 
            Source         
        FROM 
            table i         
        WHERE 
            (i.Digit/10) = (t.Digit/10)         
        GROUP BY 
            i.Source         
        ORDER BY 
            COUNT(*) DESC     
    )  
FROM 
    table t     
GROUP BY 
    t.Digit/10  
HAVING 
    COUNT(*) = 10 

Я думаю, что это будет быстрее, но вы должны проверить это и посмотреть.

0 голосов
/ 10 марта 2011

Вы можете идентифицировать строки, которые являются кандидатами на сжатие без курсора (я думаю), группируя по подстроке цифры (длина -1) HAVING count = 10. Это идентифицирует цифры с 10 дочерними строками. Вы можете использовать этот список для вставки в новую таблицу, а затем использовать его снова для удаления из исходной таблицы. Остались бы строки, в которых не было бы всех 10, которые вы также хотели бы вставить в новую таблицу (или скопировать новые данные обратно в оригинал).

Имеет ли это смысл? Я могу написать это немного лучше, если это не так.

Возможное решение SQL:

SELECT
    SUBSTRING(t.Digit,0,len(t.Digit)-1)

    (SELECT TOP 1 Source
        FROM innerTable i
        WHERE SUBSTRING(i.Digit,0,len(i.Digit)-1)
                = SUBSTRING(t.Digit,0,len(t.Digit)-1)
        GROUP BY i.Source
        ORDER BY COUNT(*) DESC
    )

FROM table t
    GROUP BY SUBSTRING(t.Digit,0,len(t.Digit)-1)
HAVING COUNT(*) = 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...