我想计算总和、运行总和、不同、运行不同 - 最好在一个查询中全部完成。
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 进行自联接以获取累积/运行数据,但这会导致重复计算。
答案 0 :(得分:1)
首先:总是以正确的数据类型存储数据,day
应该是一个 date
列。
计算 sum(quantity)
聚合的运行总和非常简单,您只需将其嵌套在窗口函数中:SUM(SUM(...)) OVER (...)
。
计算每个 food
的唯一 store
的运行数量更复杂,因为您希望 分组之前的唯一项目的滚动数量,并且没有 {{1} } SQL Server 中的窗口函数(这是我正在使用的)。
所以我已经计算了所有天中每个 COUNT(DISTINCT
和 row_number()
的 store
,然后我们只需总结我们得到 food
的次数,即这是我们第一次看到这个 1
。
food