TSQL-找到范围内的最小值
编辑: 问题陈述: 选择3月初至5月底之间的所有SIIIS和SULLS数据 对于SIIIS中的每个“XFFF”,在SULLS中的“XFFF”中查找任何匹配项,其中SULLS中的“开始时间”在SIIIS中的“案例创建”之后,并且“开始时间”和“案例创建”之间的时间差小于3小时。 选择时间差最小的匹配项TSQL-找到范围内的最小值,sql,sql-server,tsql,Sql,Sql Server,Tsql,编辑: 问题陈述: 选择3月初至5月底之间的所有SIIIS和SULLS数据 对于SIIIS中的每个“XFFF”,在SULLS中的“XFFF”中查找任何匹配项,其中SULLS中的“开始时间”在SIIIS中的“案例创建”之后,并且“开始时间”和“案例创建”之间的时间差小于3小时。 选择时间差最小的匹配项 select si.XFFF xfff, DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) diffInhours from siiis si
select
si.XFFF xfff,
DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) diffInhours
from siiis si inner join sulls su on si.xfff= su.xfff
where
((si.CASE_CREATE BETWEEN '20130301' AND '20130531') and (su.START_TIME between '20130301'AND '20130531'))
and
(su.START_TIME > si.CASE_CREATE) and
(DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) < 3 and DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) > 0)
试试这个代码。基本上,它应该做的是按DATEDIFFhour、si.CASE\u CREATE、su.START\u TIME的升序排序,然后选择第一个1。它没有经过测试,所以我解释了逻辑
SELECT TOP 1
si.num_phone Phone,
su.start_time sulstarrtTime ,
si.CASE_CREATE siStartTime,
DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) diffInhours
from siiis si inner join sulls su on si.num_phone = su.num_phone
where
((si.CASE_CREATE BETWEEN '20130301' AND '20130531') and (su.START_TIME between '20130301'AND '20130531'))
and
(su.START_TIME > si.CASE_CREATE) and
(DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) < 3 and DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) > 0)
order by DATEDIFF(hour, si.CASE_CREATE, su.START_TIME) ASC
试图清理和修复您的代码,如果在sqlserver 2008+上运行,datediff将不会给您时间上的差异非常常见的误解,因此我采取了不同的方法:
select
si.num_phone Phone,
su.start_time sulstarrtTime ,
si.CASE_CREATE siStartTime,
datediff(hour, 0, su.START_TIME - si.CASE_CREATE) diffInhours
from siiis si
cross apply
(select top 1 * from sulls su
where
si.xfff= su.xfff
and su.START_TIME > si.CASE_CREATE
-- less than 3 hours difference
and dateadd(hour, 3, si.CASE_CREATE) > su.START_TIME
-- more than 1 hour difference your code indicated you needed this, your text said otherwise
--and dateadd(hour, 1, si.CASE_CREATE) <= su.START_TIME
order by START_TIME
) su
WHERE si.CASE_CREATE BETWEEN '20130301' AND '20130531' -- you are not including all of may
较好的如果你把你的问题也包括进去,我就只得到一张记录。但是当有多条记录时,我需要一条记录。你是说你想以最小的差异显示所有记录?看起来你的解决方案可行,你是冠军。但是我不明白你的代码:@coolcake除非你需要更多的信息,如果你接受这个作为答案,我将不胜感激