使用日期在SQL中创建加权平均值

时间:2015-05-11 19:49:42

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

我有一个SQL查询,列出了某个项目的详细信息。除了最后一栏,一切都正常。我希望weight of transaction列报告天数差异。

例如,txdate列中的第4行是05/21/2014,第3行是2014年12月5日。第4行中的weight of transaction列应该是9。

我读到了Lag和Lead功能,但我不确定如何实现带日期的功能(如果可能的话)。如果不可能有办法实现这一目标吗?

SQL results

Select t.txNumber, 
   t.item, 
   t.txCode, 
   t.txdate, 
   (t.onhandlocold + t.stockQty) as 'Ending Quantity',
   tmax.maxtnumber 'Latest Transaction Code',
   tmax.maxdate 'Latest Transaction Date', 
   tmin.mindate 'First Transaction Date', 
   (t.txdate - tmin.mindate) 'weight of transaction'

From tbliminvtxhistory t
 Left outer join
     (Select t.item, max(t.txnumber) as maxtnumber, max(t.txdate) as maxdate
      From tbliminvtxHistory t
      Where t.txCode != 'PAWAY'
      Group By Item) tmax
  on t.item = tmax.item
Left Outer Join
     (Select t.item, min(t.txdate) as mindate
      From tbliminvtxHistory t
      WHere  t.txCode != 'PAWAY'
         and t.txdate > DateAdd(Year, -1, GetDate())
      Group By Item) tmin
  on t.item = tmin.item

where t.item = 'LR50M' 
and t.txCode != 'PAWAY'
and t.txdate > DateAdd(Year, -1, GetDate())

2 个答案:

答案 0 :(得分:2)

查看DATEDIFF函数,它将返回两个日期之间的差异。

我认为这就是你要找的东西:

DATEDIFF(dd,tmin.mindate,t.txdate)

<强>更新

现在我对你的问题了解得更好了,这是一个更新。正如在上述帖子的评论中所提到的,LAG函数仅在SQL 2012及更高版本中受支持。另一种方法是使用ROW_NUMBER并将结果存储到临时表中。然后,您可以在结果中的下一个ROW_NUMBER上将联接返回到同一个表格。然后,您将使用DATEDIFF来比较日期。这将与LAG函数完全相同。

示例:

SELECT ROW_NUMBER() OVER (ORDER BY txdate) AS RowNumber,*
INTO #Rows
FROM tbliminvtxhistory 

SELECT DATEDIFF(dd,r2.txdate,r.txdate),* 
FROM #Rows r
LEFT JOIN #Rows r2 ON r.RowNumber=r2.RowNumber+1

DROP TABLE #Rows

答案 1 :(得分:1)

我认为你正在寻找这个表达方式:

Select . . . ,
       datediff(day, lag(txdate) over (order by xnumber), txdate)

这假设行按第一列排序,根据您的解释和样本数据,这似乎是合理的。

编辑:

如果没有lag(),您可以使用outer apply。为简单起见,我假设您的查询被定义为CTE:

with cte as (<your query here>)
select . . . ,
       datediff(day, prev.txdate , cte.txdate)
from cte cross apply
     (select top 1 cte2.*
      from cte cte2
      where cte2.xnumber < cte.xnumber
      order by cte2.xnumber desc
     ) prev