使用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子句有何影响,如何确保获得所需的所有数据?
感谢所有帮助的人!
答案 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