SQL:获取最近2次购买的平均值,并指出找到的购买次数

时间:2014-04-17 18:25:37

标签: jquery sql sql-server sql-server-2008

我需要获得每篇文章的最后两次购买(并将其平均)并知道发现了多少次购买(有些可能没有,一次或多次)

我试图做这样的事情

select ArticleId, sum(cost*quantity)/sum(quantity) as AverageCost, count(PurchaseId) 
where PurchaseId in (select top 2 * from PurchasesTable order by PurchaseDate)
from vsboremix.dbo.PurchaseTable join vsboremix.dbo.DocumentTable on pt.DocumentId=DocumentTable.DocumentId
Group by ArticleId    
// I omitted some joins so as to simplify the query 
// (I also need to bring in some tax/etc. values from separate tables)

我得到一个"当子查询未与EXISTS一起引入时,在选择列表中只能指定一个表达式。"错误,[已修复]但我不确定此查询是否是正确的方向,还是会有更简单或更好的方法来执行此操作?

对于文章我发现不到两次购买,我需要运行单独的查询来获取其他信息以调整其平均值,因此我还需要此查询以获取每个ArticleId是否存在是否有记录购买。

我还需要改进这个查询,因为我需要运行7个商店并且它们的值会有所不同[商店ID也会保存在相同的表格中购买日期],所以我必须运行此查询7次,子查询再运行7次。

有关修复错误或重构查询的任何建议都将不胜感激!

- [编辑]:我修复了错误,但查询只返回七个值,所有计数都是1(每个商店应该有19万个),因此查询的格式或子查询是错误的。

1 个答案:

答案 0 :(得分:1)

假设您使用的是SQL Server(基于top的使用),您可以使用窗口函数执行此操作:

select ArticleId, sum(cost*quantity)/sum(quantity) as AverageCost, count(ArticleId) 
from (select pt.*,
             row_number() over (partition by ArticleId order by PurchaseDate desc) as seqnum
      from PurchaseTable pt
     ) pt
where seqnum <= 2
Group by ArticleId;