4

我有一个性能繁重的查询,它根据其他表等中的数据过滤掉许多不需要的记录。

我正在平均一列,并返回每个平均组的计数。这一切都很好。

但是,我还想包括总计数的百分比。

有没有办法在不重新运行整个查询或显着增加性能负载的情况下获得这个总数?

如果我不需要完全重组子查询(例如,通过获取它之外的总数),我也更愿意,但如果有必要可以这样做。

SELECT 
    data.EquipmentId,
    AVG(MeasureValue) AS AverageValue,
    COUNT(data.*) AS BinCount
    COUNT(data.*)/ ???TotalCount??? AS BinCountPercentage
FROM
(SELECT * FROM MultipleTablesWithJoins) data
GROUP BY data.EquipmentId
4

2 回答 2

7

请参阅窗口函数

SELECT 
    data.EquipmentId,
    AVG(MeasureValue) AS AverageValue,
    COUNT(*) AS BinCount,
    COUNT(*)/ cast (cnt as float) AS BinCountPercentage
FROM
(SELECT *,
      -- Here is total count of records
        count(*) over() cnt
 FROM MultipleTablesWithJoins) data
GROUP BY data.EquipmentId, cnt

编辑:忘记实际划分数字。

于 2012-07-27T11:47:52.850 回答
1

另一种方法:

with data as
(
    SELECT * FROM MultipleTablesWithJoins
)
,grand as
(
    select count(*) as cnt from data
)
SELECT 
    data.EquipmentId,
    AVG(MeasureValue) AS AverageValue,
    COUNT(data.*) AS BinCount
    COUNT(data.*)/ grand.cnt AS BinCountPercentage
FROM data cross join grand
GROUP BY data.EquipmentId
于 2012-07-27T12:19:27.933 回答