[英]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.