簡體   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