繁体   English   中英

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

[英]SQL Server 2012: distinct with over clause in an aggregate function

使用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 我正在尝试尽可能多地使用分区,以便我会更好地使用窗口功能

使用不包含count()以外的聚合的distinct通常是不正确的。 对于窗口函数和聚合函数都是如此。

您可以使用row_number()和条件聚合来完成count(distinct)的等效操作:

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;

编辑:

COUNT(DISTINCT)不同,以上内容会将NULL值视为“有效”值。 这很容易补救:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM