sql逻辑压缩记录

时间:2011-03-10 09:06:05

标签: sql algorithm compression

我在SQL中有一个包含100多万条记录的表,我希望使用以下算法进行压缩,现在我正在寻找最佳方法,最好不要使用游标。

如果表中包含一个数字的所有10个可能的最后数字(从0到9)(如下例中的252637),我们将找到最常用的Source(在我们的示例中为'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 个答案:

答案 0 :(得分:2)

这只是Tom Morgan's已接受答案的另一个版本。它使用除法而不是子串来修剪BIGINT数字列的最低有效数字:

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 

我认为它会更快,但你应该测试它并看看。

答案 1 :(得分:0)

您可以通过GROUPing通过Digit的子字符串(长度-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