一种方法是UNION
...
select
employee_id,
Max(activity_date) activity_date,
'2017-05-01' as snap_shot
from SomeTable
where activity_date <= '20170501'
group by employee_id
union
select
employee_id,
Max(activity_date) activity_date,
'2017-04-01' as snap_shot
from SomeTable
where activity_date <= '20170401'
group by employee_id
union
select
employee_id,
Max(activity_date) activity_date,
'2017-03-01' as snap_shot
from SomeTable
where activity_date <= '20170301'
group by employee_id
或者,如果你希望有一堆日期,use a CTE的...只是设置@启动和@结束变量
declare @table table (activity_date date, Employee_id int)
insert into @table
values
('5/29/2017',1),
('4/15/2017',1),
('1/14/2017',2),
('4/14/2017',2),
('2/15/2017',2),
('6/15/2017',3),
('1/13/2017',4)
DECLARE @start DATE, @end DATE;
SELECT @start = '20170301', @end = '20170501'
;WITH n AS
(
SELECT TOP (DATEDIFF(month, @start, @end) + 1)
n = ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects
),
x as
(
SELECT DATEADD(month, n-1, @start) DT
FROM n
)
select
Employee_id
,Max(activity_date) activity_date
,DT
from @table
inner join x on activity_date <= DT
group by Employee_id, DT
order by DT desc
SQL Server或Oracle?请选择一个。 – scsimon
我删除了不兼容的数据库标记。请仅使用您正在使用的数据库进行标记。 –
您确定employee_id 1应该有4/1快照的记录吗?活动日期后将发生该快照 – scsimon