我在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
答案 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