我有一个要求,我需要获得一个与当前记录具有最小时差的记录。让我们假设在一个表中,我有插入日期、组Id和Id列。我已经选择了一条记录,不想再获得一条所选记录和另一条记录的插入日期相差最小的记录。
我尝试过外部应用程序,但该查询需要很长时间才能运行。
查询:
select e.id
from B.Emp t
where id = 5
outer apply (
select top 1 *
from B.Emp
where t.group_id = group_id
order by insert_time desc ) e
select * From B.Emp emp
Inner Join
(
select MAX(emp1.insert_time) maxTime, emp1.id From B.Emp emp1 group by emp1.id
) maxDateRec ON maxDateRec.id = emp.id AND maxDateRec.maxTime = emp.insert_time
where emp.id = 5
试试第二个。
如果您确实想为所选记录组找到最近的插入时间,而不管方向如何,那么这样的方法可能会有所帮助:
select t.insert_date, ca.*
from B.Emp t
outer apply (
select top (1) * from B.Emp e
where e.group_id = t.group_id
and e.id != t.id
order by abs(datediff(ms, t.insert_date, e.insert_date))
) ca
where t.Id = 5;
编辑:不过,您肯定需要检查索引选项。对于初学者来说,假设您在Id
列上有一个集群主键,这应该会有所帮助:
create index [IX_B_Emp_GroupInsert] on B.Emp (group_id, insert_time);
此查询未经过测试。如果查询中有任何错误或需要进行更改,请回复我。
CREATE TABLE Emp
(
group_Id INT,
ID INT,
date DATETIME
)
INSERT INTO EMP
(group_Id,ID,date)
values
(1,5,'11-Jan-2014'),
(1,5,'12-Jan-2014')
--
select ID,date from Emp t
group by
ID,
date having id = 5
and
date =
(select max(date) from Emp where id = 5)