2016-05-31 99 views
0

我的表(products)是如下:计算过去7天,每天在范围

id, productId, price, saleDate 

我想建立一个查询,具体productId和具体的数据范围将返回价格的平均水平该范围内每天的最后7天。

以下查询会给我所有的数据,具体的productId 16年1月1日和16年2月1日之间

SELECT * FROM products WHERE productId='PS54434' AND saleDate BETWEEN '2016-01-01' AND '2016-02-01' 

,但我想,对于每16年1月1日一天,直到02/01/16我将收到最后7天 所以对于数据01/01/16我将收到12/26/16-01/01/16价格的平均值

+0

什么版本的SQL Server? – RBarryYoung

回答

0

一种方法是使用一个循环。您声明开始日期并从该日期起7天后返回并获取该日期范围内的平均价格。然后添加1天并重复该过程。如果您需要将所有结果作为表格创建临时表并存储每次迭代的结果。

declare @startdate date = '2016-01-01'; 
create table #tmpavgprice (price numeric(10,2)); 

while @startdate <= '2016-02-01' 
begin 
SELECT avg(price) 
INTO #tmpavgprice 
FROM products 
WHERE productId='PS54434' 
AND saleDate BETWEEN dateadd(dd,-7,@startdate) AND @startdate; 

set @startdate = select dateadd(dd,1,@startdate); 

end; 

select * from #tmpavgprice; --to get the final result 
+0

不要忘记游标。 –

1

尝试以下查询:

SELECT p.id, p.productid, p.saleDate, oa.avgPriceLast7Days 
FROM products p 
OUTER APPLY (
    SELECT AVG(d.price) AS avgPriceLast7Days 
    FROM products d 
    WHERE d.productid = p.productid 
    AND  d.saleDate BETWEEN DATEADD(DAY, -7, p.saleDate) AND p.saleDate 
) oa 
WHERE p.productId='PS54434' 
AND  p.saleDate BETWEEN '2016-01-01' AND '2016-02-01' 
+0

注意:我认为'saleDate'列的数据类型是'DATE'。 –