SQL Server 2012:与聚合函数中的over子句不同

时间:2015-10-29 13:00:15

标签: sql sql-server tsql sql-server-2012 window-functions

使用over (partition by)编写聚合函数的正确语法是什么?

或者怎么可能重写呢?我没有一些样品表,因为我这样做是为了锻炼自己。我想知道这是否可行。请在下面找到我想到的场景。

让我们以一个简单的例子作为样本:

select 
    *,
    sum (column1 * column2) over (partition by column10, colum12)/100 as sumProduct
into #myTemp
from myTable

上面的查询适用于包含这些列的表。 现在,我怎样才能为column1column2的不同值编写相同的内容?

下面的查询不起作用,但它是我想要实现的目标的伪。

预期结果非常简单(见distinct column1 * distinct column2

select 
    *,
    sum (distinct column1 * distinct column2) over (partition by column10, colum12)/100 as sumProduct
into #myTemp
from myTable

编辑:我想避免group by。我尽可能多地尝试使用分区,所以我会更好地使用窗口函数

1 个答案:

答案 0 :(得分:2)

distinctcount()以外的聚合一起使用通常是不正确的。这对于窗口函数和聚合函数都是如此。

您可以使用count(distinct)和条件聚合

执行等效的row_number()
select t.*,
       sum(case when seqnum = 1 then 1 else 0 end) as CountDistinct
into #myTemp
from (select t.*,
             row_number() over (partition by column10, colum12 order by (select NULL)) as seqnum
      from myTable t
     ) t;

编辑:

以上将NULL值计为"有效"价值,与COUNT(DISTINCT)不同。这很容易解决:

select t.*,
       count(case when seqnum = 1 then colum12 end) as CountDistinct
into #myTemp
from (select t.*,
             row_number() over (partition by column10, colum12 order by (select NULL)) as seqnum
      from myTable t
     ) t;