activity_date Employee_id
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
我如何编写一个查询,该查询将在员工的最新活动中拍摄快照,就好像它是5/1/2017一样,然后再次循环并拍摄快照,好像2017年4/1/2017等。<<<<<<<<<<<</p>
这是我想要循环的最后3个日历月的输出。
activity_date Employee_id snapshot_date
4/15/2009 1 5/1/2017
4/14/2009 2 5/1/2017
1/13/2009 4 5/1/2017
2/15/2009 2 4/1/2017
1/13/2009 4 4/1/2017
2/15/2009 2 3/1/2017
1/13/2009 4 3/1/2017
谢谢
会有类似的工作吗?
SELECT Max(activity_date), Employee_id, '2017-05-01' AS snapshotDate
FROM YOUR_TABLE_NAME
WHERE activity_date <= '2017-05-01'
GROUP BY Employee_id
它为您提供这样的结果:
2017-04-15 1 2017-05-01
2017-04-14 2 2017-05-01
2017-01-13 4 2017-05-01
编辑:如果您想要多个循环,则可以使用SQL进行循环。这是代码:
CREATE TABLE prac(
activity_date DATE,
Employee_id int
)
INSERT INTO prac (activity_date, Employee_id)
VALUES ('2017-05-29', 1),
('2017-04-15', 1),
('2017-01-14', 2),
('2017-04-14', 2),
('2017-02-15', 2),
('2017-06-15', 3),
('2017-01-13', 4)
DECLARE @i date = '2017-05-01'
WHILE @i >= '2017-03-01'
BEGIN
SELECT Max(activity_date), Employee_id, @i AS snapshotDate
FROM prac
WHERE activity_date <= @i
GROUP BY Employee_id
SET @i = DATEADD(MONTH,-1,@i)
END
上面的代码将循环到3月至5月,输出看起来像这样:
2017-04-15 1 2017-05-01
2017-04-14 2 2017-05-01
2017-01-13 4 2017-05-01
2017-02-15 2 2017-04-01
2017-01-13 4 2017-04-01
2017-02-15 2 2017-03-01
2017-01-13 4 2017-03-01
一种方法是 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
,或者如果您希望有一堆日期,请使用CTE ...只需设置@start和@end变量
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