以最小时差获得记录

时间:2014-11-05 05:37:13

标签: sql sql-server tsql

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

3 个答案:

答案 0 :(得分:1)

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

尝试使用第二个。

答案 1 :(得分:0)

此查询未经过测试。 请回复我是否有任何错误或需要在查询中进行更改。

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)

答案 2 :(得分:0)

如果您确实想要为所选记录组找到最接近的插入时间,无论方向如何,那么这样的事情可能有所帮助:

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);