我有一个具有数百万行和940列的表。我真的希望有一种汇总这些数据的方法。我想查看每个列的每个值的频率。我在少数列中使用了此代码,但是在处理量太大之前,我将无法获得更多列。
SELECT
f19_24
,f25_34
,f35_44
,f45_49
,f50_54
,f55_59
,f60_64
,count(1) AS Frequency
FROM
(SELECT a.account, ntile(3) over (order by sum(a.seconds) desc) as ntile
,f19_24
,f25_34
,f35_44
,f45_49
,f50_54
,f55_59
,f60_64
FROM demo as c
JOIN aggregates a on c.customer_account = a.account
WHERE a.month IN ('201804', '201805', '201806')
GROUP BY a.account
,f19_24
,f25_34
,f35_44
,f45_49
,f50_54
,f55_59
,f60_64
)
WHERE ntile = 1
GROUP BY
f19_24
,f25_34
,f35_44
,f45_49
,f50_54
,f55_59
,f60_64
问题在于GROUP BY
太麻烦了。还有其他方法吗???能够看到高频在如此大的数据集中的位置,这真的很有帮助。
答案 0 :(得分:0)
使用索引可以帮助您更快地获得此类查询结果。最好的办法取决于表具有哪些其他字段以及针对该表运行哪些其他查询。月指数,包括 聚集或演示或客户上的f19_24,f25_34,f35_44,f45_49,f50_54,f55_59,f60_64(因为我不知道哪个表包含这些字段),例如此索引:
CREATE NONCLUSTERED INDEX IX_fasterquery
ON aggregates(month,accoun)
INCLUDE (f19_24,f25_34,f35_44,f45_49,f50_54,f55_59,f60_64);
这是因为,如果您有该索引,则SQL在运行查询时将根本无法访问实际表,因为它可以在索引中找到带有给定“ month,accoun,createddate”的所有行,并且它将能够真正快速地执行此操作,因为索引在使用定义键的字段时允许快速访问,并且每行的“ f19_24,f25_34,f35_44,f45_49,f50_54,f55_59,f60_64”值也分别为在您的情况下,通过将该查询作为proc可能会得到其他结果,而我建议这样做的原因是here。