3

データベースから、連続する日付の差が最大になるように、日付ごとに 2 つの連続するレコードを選択したいと考えています。

机がある

お名前 日付
abc 1242
紀元前1246年
BSD 1247
bse 1249

クエリの結果は次のようになります。

abc 1242
紀元前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
    )

これが最善の解決策ですか?

前もって感謝します

4

2 に答える 2

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
于 2013-05-14T13:53:25.517 に答える
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)

これは、日付による並べ替えが正しいことを前提としています...

于 2013-05-14T15:39:32.777 に答える