簡體   English   中英

如何將 SUM 函數與具有相同值的 OVER 子句一起使用,以便按列返回正確的總和?

[英]How can i use SUM function with OVER clause having same values in order by column to return correct sum?

我有一個場景,我需要使用 sql SUM 函數獲取 sum 列。 我有一個這樣的示例數據:

示例表:

dateCol,   myCol
-----------------------
'12:00:01'   3
'12:00:01'   4
'12:00:01'   5
'12:00:01'  NULL
'12:00:01'  NULL
'12:00:01'   3

我正在使用下面顯示的查詢來計算 myCol 列的總和

select 
    dateCol, myCol,
    sum(case when dateCol is not null  then 1 end) over (order by dateCol) as sumCol
from   
    sampleTable;

我得到這些結果:

    dateCol myCol   sumCol
--------------------------
1   12:00:01    3       4
2   12:00:01    4       4
3   12:00:01    5       4
4   12:00:01    NULL    4
5   12:00:01    NULL    4
6   12:00:01    3       4

但我期待這些結果:

    dateCol myCol   sumCol
--------------------------
1   12:00:01    3       1
2   12:00:01    4       2
3   12:00:01    5       3
4   12:00:01    NULL    3
5   12:00:01    NULL    3
6   12:00:01    3       4

如何修改查詢以返回預期結果?

SQL 中累積總和的默認值是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ,而不是ROWS BETWEEN UNBOUNDED PRECEDING 您似乎無法區分行。

您可以嘗試明確的窗口規范:

select dateCol, myCol,
       count(dateCol) over (order by dateCol rows between unbounded preceding and current row) as sumCol
from sampleTable;

請注意,我還簡化了邏輯,使用count()而不是sum()

如果您有一列來指定排序,則在order by使用該列:

select dateCol, myCol,
       count(dateCol) over (order by dateCol, ?) as sumCol
from sampleTable;

這將使排序穩定並區分行。

如果沒有,您可以創建一個列。 但是,結果的順序可能不同——SQL 表表示無序集。 所以:

select dateCol, myCol,
       count(dateCol) over (order by dateCol, seqnum) as sumCol
from (select st.*, row_number() over (order by dateCol) as seqnum
      from sampleTable
     ) st;

我將嘗試使用標准 SQL 進行解釋。 您正在嘗試使用聚合函數 sum 對 dateCol、myCol 進行分組。 基本上你需要定義 GROUP BY 子句,結果視圖可以使用普通的 order by 子句進行排序

  select dateCol, myCol,
         sum(case when dateCol is not null  then 1 else 0 end)  as sumCol
  from sampleTable
  group by dateCol, myCol
  order by dateCol

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM