2013-05-14 2 views
3

Я хочу выбрать две последовательные записи по дате, записи из базы данных с максимальной разницей в последовательных датах.Выберите две последовательные записи по дате, записи из базы данных с максимальной разницей дат

есть таблица

 
name date 
abc 1242 
bcd 1246 
bsd 1247 
bse 1249 

Результат запроса должен быть:

 
abc 1242 
bcd 1246 

Мой запрос:

 
    select t1.name, t2.name, max(t2.date - t1.date) 
    from temp t1 
    join temp t2 on t1.date < t2.date 
    where 
    not exists (
     select t3.date from temp t3 where t3.date > t1.date and t3.date < t2.date 
    ) 

Является ли это лучшим решением?

Заранее спасибо

+0

Какая версия SQL Server? –

ответ

0
declare @a table(name varchar(10), date int) 
insert into @a Select 'abc', 1242 
union Select 'bcd', 1246 
union Select 'bsd', 1280 
union Select 'bse', 1242 

Select row_number() OVER (ORDER BY name) AS 'RowNumber',* into #temp from @a 

select Top 1 * into #tbl from 
(
select a1.Name as N1,a2.Name as N2,abs(a2.date-a1.date) as diff 
from #temp a1 Join #temp a2 on a2.rownumber-1 = a1.rownumber 
)as tbl order by diff desc 

select * from @a where name =(select N1 from #tbl) or name =(select N2 from #tbl) 

Drop table #temp 
Drop table #tbl 
+0

OVER (ORDER BY name) вернет неожиданные результаты, OVER (ORDER BY date) будет в порядке. – bummi

+0

Да, OVER (ORDER BY date) было бы более точным, спасибо, что дайте мне знать :) –

0

Мое решение, хорошо для SQL 2012, по крайней мере!

declare @data table (name varchar(10), date int) 

-- Your test data 
insert into @data (name, date) values ('abc', 1242),('bcd', 1246),('bsd', 1247),('bse', 1249) 

SELECT d.name, d.date FROM (
    SELECT TOP 1 name, prevName FROM (
    SELECT name, prevName, date-prevDate as datePrevDiff FROM (
     SELECT name, date 
     , MAX(d.name) OVER (ORDER BY d.date ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) as prevName 
     , MAX(d.date) OVER (ORDER BY d.date ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) as prevDate 
     FROM @data d 
    ) dataWithPrev 
) dataWithPrevDiff 
    ORDER BY datePrevDiff DESC 
) largestDiff 
INNER JOIN @data d ON d.name in (largestDiff.name, largestDiff.prevName) 

Это предполагает сортировку по дате, является то, что нужно делать ...

Смежные вопросы