Sql server 具有聚合值条件的SQL聚合

Sql server 具有聚合值条件的SQL聚合,sql-server,subquery,aggregate-functions,Sql Server,Subquery,Aggregate Functions,我想从BillDetails表中获取净数量的聚合,其中该聚合值应为非零。我写了一个查询,如下所示。但感觉它没有优化。有没有人可以折射这个。任何尝试都将不胜感激 SELECT * FROM ( SELECT DISTINCT CustId, Name, SUM(NetQuantity) OVER(PARTITION BY CustId, Name) AS Quantity FROM BillDetails ) T WHERE Quantity <> 0 没有办

我想从BillDetails表中获取净数量的聚合,其中该聚合值应为非零。我写了一个查询,如下所示。但感觉它没有优化。有没有人可以折射这个。任何尝试都将不胜感激

SELECT * FROM
(
    SELECT DISTINCT CustId, Name, SUM(NetQuantity) OVER(PARTITION BY CustId, Name) AS Quantity
        FROM BillDetails
) T WHERE Quantity <> 0

没有办法优化此查询,这是获得这些结果的唯一方法。如果表上有适当的索引,则不会出现性能问题。 更新 对于预筛选零值行,可以使用以下查询:

SELECT * FROM(
SELECT DISTINCT CustId, Name, SUM(NetQuantity) OVER(PARTITION BY CustId, Name) AS Quantity
    FROM BillDetails
    WHERE NetQuantity <> 0) T WHERE Quantity <> 0

它从整个表中获取聚合并使用条件过滤结果。你还在说没有性能下降吗?如果NetQuantity可以存储负数,那么就没有办法过滤导致零SumNetQuantity的行。除了将0作为NetQuantity的行之外,我认为零值频率没有那么高,不会导致性能问题。在我的情况下,零值聚合频率超过20%。记录总数为数千。零值行不聚合的频率是多少?您不能对零值聚合值执行任何操作,但可以预筛选零值行以获得更好的性能,但首先必须在表上声明适当的索引。我将编辑预筛选查询的答案为什么不使用简单聚合查询?按CustId、Name和SUMNetQuantity 0从BillDetails组中选择CustId、Name、SUMNetQuantity作为数量您对这一组的性能有何了解?如果您有BillDetails CustID的索引,应该会非常快,名称包括NetQuantity.to Nikola Markovinovic。像Sum Over这样的分析函数比使用group by的简单聚合函数快得多。@VahiD我不明白为什么总是这样,在我上面提到的索引的这种特殊情况下,简单group by在我的测试表上比窗口函数快9倍500万条记录,少量不同的CustID值。注意,在上面的查询中,分区是由相同的列组成的——这里有大量重复的工作要做。