总和和运行总和、相异和相异

时间:2021-04-28 18:36:30

标签: sql

我想计算总和、运行总和、不同、运行不同 - 最好在一个查询中全部完成。

http://sqlfiddle.com/#!18/65eff/1

create table test (store int, day varchar(10), food varchar(10), quantity int)
insert into test select 101, '2021-01-01', 'rice', 1
insert into test select 101, '2021-01-01', 'rice', 1
insert into test select 101, '2021-01-01', 'rice', 2
insert into test select 101, '2021-01-01', 'fruit', 2
insert into test select 101, '2021-01-01', 'water', 3
insert into test select 101, '2021-01-01', 'fruit', 1
insert into test select 101, '2021-01-01', 'salt', 2
insert into test select 101, '2021-01-02', 'rice', 1
insert into test select 101, '2021-01-02', 'rice', 2
insert into test select 101, '2021-01-02', 'fruit', 1
insert into test select 101, '2021-01-02', 'pepper', 4

唯一值(不同)和总数(总和)很简单:

select store, day, count(distinct food) as uniques, sum(quantity) as total
from test
group by store, day

但我希望输出为:

<头>
商店 独特之处 run_uniques 总计 run_total
101 2021-01-01 4 4 12 12
101 2021-01-02 3 5 10 22

我尝试使用 t.day >= prev.day 进行自联接以获取累积/运行数据,但这会导致重复计算。

1 个答案:

答案 0 :(得分:1)

首先:总是以正确的数据类型存储数据,day 应该是一个 date 列。

计算 sum(quantity) 聚合的运行总和非常简单,您只需将其嵌套在窗口函数中:SUM(SUM(...)) OVER (...)

计算每个 food 的唯一 store 的运行数量更复杂,因为您希望 分组之前的唯一项目的滚动数量,并且没有 {{1} } SQL Server 中的窗口函数(这是我正在使用的)。

所以我已经计算了所有天中每个 COUNT(DISTINCTrow_number()store,然后我们只需总结我们得到 food 的次数,即这是我们第一次看到这个 1

food