SQL - 制作多个分组(性能)

时间:2015-07-26 08:27:03

标签: sql sql-server

我有一些SQL查询根据提供的参数创建记录。该查询非常繁重,因此我希望尽可能少地执行它。

从该查询中获得结果后,我需要执行其细分。

例如,请考虑以下查询:

SELECT location, department, industry
FROM data
WHERE ...

之后,我需要对结果进行细分,例如我需要提供所有地点的清单,其中我有结果和每种类型的数量,部门相同,行业相同。

据我所知,为了按位置细分,我需要执行GROUP BY(位置)然后计数。

我的问题是:出于性能考虑,是否有可能对查询结果执行多次分组/计数而无需为每个分组反复重新计算?

2 个答案:

答案 0 :(得分:0)

是的,这是可能的。除非我误解了你。

您需要使用windowed functions。例如:

SELECT location
    , department
    , industry
    , COUNT(*) OVER(PARTITION BY location, department)
    , COUNT(*) OVER(PARTITION BY location, department, industry)
FROM data
WHERE ...;

请注意,无法执行COUNT(DISTINCT column)

答案 1 :(得分:0)

如果我理解正确,您可以使用grouping sets(记录here)执行您想要的操作:

SELECT location, department, industry, count(*)
FROM data
WHERE ...
GROUP BY GROUPING SETS ((location), (department), (industry))

这将返回如下行:

location1    NULL     NULL    10
. . .
NULL         dept1    NULL    17
. . .

如果您想获得想象力,并且任何列中都没有NULL值,您可以这样做:

SELECT (case when location is not null then 'location'
             when department is not null then 'department'
             when industry is not null then 'industry'
        end) as which,
       coalesce(location, department, industry) as name, count(*)
FROM data
WHERE ...
GROUP BY GROUPING SETS ((location), (department), (industry))
ORDER BY which;

如果您的列中包含GROUPING()值,您实际上可以使用NULL函数执行相同的操作,但您也必须替换coalesce()