order by时的分区可能为null

时间:2014-07-15 15:17:52

标签: tsql left-join partitioning

使用TSQL 2008 R2,我有一张人口统计数据表和一个活动表。我想左边连接表,所以我得到所有的演示数据和任何存在的活动。此外,我想为每一行分配一个行号,这样,如果人口统计表中的任何给定人员有多个活动行,则对行进行编号,使得最近的行为第1行。

我有:

Select D.*, A.ActivityDate, A.ActivityType, A.PersonId,
ROW_NUMBER() OVER (Partition By A.PersonId Order by A.ActivityDate DESC) as RowNumber
From Demo D
Left Join Activity A
On D.PersonId = A.PersonID

由于并非Demo表中的所有人都有活动,因此Left Join on Activity会将A.ActivityDate显示为Null。

这对Order By子句有何影响,如何确保获得所需的所有数据?

感谢所有帮助的人!

2 个答案:

答案 0 :(得分:1)

您是否考虑过在订单中使用合并?这将给那些为null的记录,默认值。

ROW_NUMBER() OVER (Partition By A.PersonId Order by COALESACE(A.ActivityDate, CAST('1/1/1900 00:00:00' AS date)) DESC) as RowNumber

这将使您的查询输出如下:

Select D.*, A.ActivityDate, A.ActivityType, A.PersonId,
ROW_NUMBER() OVER (Partition By A.PersonId Order by COALESACE(A.ActivityDate, CAST('1/1/1900 00:00:00' AS date)) DESC) as RowNumber
From Demo D
Left Join Activity A
On D.PersonId = A.PersonID

就你的问题而言

  

"这对Order By子句有何影响,如何确定我   得到我需要的所有数据?"

这会强制将带有空值的记录排序到列表的底部(因为它会下降),因为它们的默认值为1/1/1900,因此假设您的专栏是日期时间。

答案 1 :(得分:0)

左边的分区,所以你有一个分区值

Partition By D.PersonId Order by A.ActivityDate DESC

自己测试

Select D.*, A.ActivityDate, A.ActivityType, A.PersonId
From Demo D
Left Join Activity A
On D.PersonId = A.PersonID 
order by D.PersonId, A.ActivityDate DESC

Select D.*, A.ActivityDate, A.ActivityType, A.PersonId
From Demo D
Left Join Activity A
On D.PersonId = A.PersonID 
order by D.PersonId, A.ActivityDate ASC