我有一个查询返回带有操作日期的用户操作,但是,我希望我的查询返回带有日期的所有操作,但是当日期等于上一个日期时,操作日期返回null,例如
action date
gone shopping 10/1/2011
swimming 10/1/2011
riding 11/1/2011
so i want my select to return rows like this
action date
gone shopping 10/1/2011
swimming NULL
riding 11/1/2011
有人有想法实现这个吗?
答案 0 :(得分:2)
据推测,这是因为您希望如何显示数据?
在这种情况下,请在用户界面代码中执行此操作,而不是在SQL查询中执行此操作。可以使用PARTITION
和ORDER BY
,但最终会得到一个非常复杂的SQL查询。
答案 1 :(得分:1)
这听起来像是你希望在应用层而不是数据库层处理这种美学逻辑的情况。
如果您更改记录的顺序,或者下游添加了GROUP BY
之类的其他逻辑,则可能会导致问题。
无理由删除数据通常是个坏主意。对于消耗下游数据的任何其他进程,您将有效地将action
与date
解耦。
答案 2 :(得分:0)
declare @T table
(
[action] varchar(20),
[date] date
)
insert into @T
select 'gone shopping', '10/1/2011' union all
select 'swimming', '10/1/2011' union all
select 'riding', '11/1/2011'
;with cte as
(
select [action],
[date],
row_number() over(order by [date], [action]) as rn
from @T
)
select C1.[action],
case when C2.[date] is null
then C1.[date]
end as [date]
from cte as C1
left outer join cte as C2
on C1.rn = C2.rn + 1 and
C1.[date] = C2.[date]
order by C1.rn