繁体   English   中英

如何用SQL遍历一个表以寻找最接近的最大日期?

[英]How to loop through a table with SQL looking for closest max date?

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

我如何编写一个查询,该查询将为雇员拍摄最新的activity_date快照,就像它是5/1/2017,然后再次循环并像在4/1/2017那里拍摄快照,依此类推。

这是我要在最近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

谢谢

一种方法是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

这样的事情会工作吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM