我有一个SQL查询,列出了某个项目的详细信息。除了最后一栏,一切都正常。我希望weight of transaction
列报告天数差异。
例如,txdate
列中的第4行是05/21/2014,第3行是2014年12月5日。第4行中的weight of transaction
列应该是9。
我读到了Lag和Lead功能,但我不确定如何实现带日期的功能(如果可能的话)。如果不可能有办法实现这一目标吗?
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())
答案 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