Tsql order by可能为空时的分区

Tsql order by可能为空时的分区,tsql,left-join,partitioning,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.Acti

使用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
由于不是演示表中的所有人都有活动,因此活动的左侧连接将把A.ActivityDate显示为Null

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


感谢所有的帮助

按左边分区,这样就有了分区值

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

您是否考虑过在订单中使用合并?这将为空记录提供默认值

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,这使得假设您的列是日期时间。

谢谢您,Brent。这是一个有趣的建议,我将继续研究。我感谢你花时间回答,责备,但用ASC交换DESC并不能说明什么。它没有说明空排序的方式?