2014-02-11 94 views
0

我需要按照dateshipped的顺序设置项目,但是在CTE中间。 我使用窗口函数来设置项目的顺序(因为我不能使用顺序)。MSSQL窗口函数

select ROW_NUMBER() over(partition by [sku] order by [dateshipped] desc) as [rows] 
,[sku] 
,[dateshipped] 
,[priceperunit] 
from [Order Details] 

我遇到的问题是当dateshipped是空的行编号而不是分配给该项目。

dateshipped为空时,我将如何获得指定的行号?

+3

这是不正确的。当'dateshipped'为'null'时,它们将首先在分区中排序。 (对不起,因为你有'desc'方向)。 [SQL小提琴](http://sqlfiddle.com/#!3/d41d8/29748) –

回答

2

如果dateshippedNULL他们无论如何都会被订购,就好像它是最早datetime,因为如果你在一个正常的ORDER BY使用可空列相同。但是,您可以首先使用CASE来指定空值是否首先或最后:

SELECT Row_number() 
     OVER( 
      partition BY [sku] 
      ORDER BY CASE WHEN dateshipped IS NULL THEN 0 ELSE 1 END ASC, 
     dateshipped DESC) AS [rows], 
     [sku], 
     [dateshipped], 
     [priceperunit] 
FROM [order details] 
+0

你是正确的我犯了一个错误,原始信息不在该表中......一旦我把它放在问题是fixexd 。 谢谢! – Ishey4