我的数据是这样的
item date country sales
----------------------------------------
motorola 2015-01-01 US 10
motorola 2015-01-01 UK 20
motorola 2015-01-02 US 40
motorola 2015-01-02 UK 80
motorola 2015-01-03 US 120
motorola 2015-01-03 UK 150
motorola 2015-01-04 US 170
motorola 2015-01-04 US 180
我想从2015年1月2日到2015年1月4日获得摩托罗拉的每日销售增量。
所以例如
我期待结果元组:
date dailyDelta
2015-01-02 90
2015-01-03 150
2015-01-04 80
获取此功能的语法是什么?我使用的是SQL Server 2012。
由于
答案 0 :(得分:0)
我并没有真正看到自我加入的方式。以下是它的工作原理:
select a.date
, a.item
, sum(a.sales) - sum(b.sales) as DailyDelta
from table a
join table b on a.product = b.product
and b.date = dateadd(day, -1, a.date)
group by a.date
, a.item
表现不佳,但它会完成工作。
答案 1 :(得分:0)
就是这样,查询逻辑就像它获得的一样简单,性能优于内连接:
select date, sum(sales) - coalesce(lag(sum(sales), 1) over (order by date), 0)
from my_sales
group by date
order by date
使用窗口函数lag
。玩它:http://sqlfiddle.com/#!6/bebab/8并阅读它:https://msdn.microsoft.com/en-us/library/hh231256.aspx
简要地说,lag(sum(sales), 1) over (order by date)
表示"获取此查询的上一条记录的总和(销售额)列,按日期排序",coalesce(XXX, 0)
表示"当XXX为空时,让我们假装它是一个零"
答案 2 :(得分:0)
以下查询基于MySQL,但您可以调整它以使其适用于SQL Server。我希望SQL Server也支持相同的
select o.date, t.tsales - sum(sales) delta from test o, (select date, sum(sales) tsales from test group by date) t
where o.date = t.date -1 group by o.date
对于上述查询,我得到以下结果
“日期”“delta” “2015-01-01”“90” “2015-01-02”“150” “2015-01-03”“80”
答案 3 :(得分:0)
使用自我加入
declare @t table (item varchar(10), [date] date,country char(2), sales int)
insert into @t (item, [date],country, sales) values
('motorola','2015-01-01','US',10),
('motorola','2015-01-01','UK',20),
('motorola','2015-01-02','US',40),
('motorola','2015-01-02','UK',80),
('motorola','2015-01-03','US',120),
('motorola','2015-01-03','UK',150),
('motorola','2015-01-04','US',170),
('motorola','2015-01-04','US',180)
;with a as (select row_number() over (order by [date]) r,[date],sum(sales) n from @t group by [date])
select a.[date],a.n-isnull(a1.n,0) dailyDelta from a join a a1 on a.r =a1.r+1
答案 4 :(得分:-1)
试试这个..
选择日期,
( sum(sales) - LAG(sum(sales),1,0) over (order by sales) ) as dailyDelta
FROM Table
按日期分组
按日期排序;