获取最小时差的记录



我有一个要求,我需要获得一个与当前记录具有最小时差的记录。让我们假设在一个表中,我有插入日期、组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)

最新更新