0

自己結合なしでテーブルの 2 つの行を比較する方法はありますか?

ID、日付、ツールの列を持つイベントのテーブルがあります。クエリを実行し、結果セットに行番号を追加します (ツールごとに日付順に並べ替えます)。ここで、行 1 と行 4 の時間差が 1 週間以上あるかどうかを知りたいです。
クエリをそれ自体に結合することでこれを実現できますが (非常に簡単です)、クエリを 2 回実行することになり (そうですか?)、これはあまり効率的ではありません (クエリは単純ではなく、既に結合が必要なため)。これを達成するためのよりスマートな方法はありますか?

私はSQLサーバーを使用しており(どのバージョンかはわかりません;おそらく2008年)、ASP.NETアプリケーションからクエリを実行しているため、DBへの管理アクセス権がなく、一部の高度な機能は機能しません(ただし、喜んですべての提案を試して確認してください)。ありがとう。

4

1 に答える 1

0

目標を達成するためにウィンドウ関数をいじることができますが、おそらく over(partition by ... order by) で十分でしょう ( http://www.sqlfiddle.com/#!6/2d448/1):

IF OBJECT_ID('tempdb..#SomeTable', 'U') IS NOT NULL
BEGIN 
    DROP TABLE #SomeTable
END

create table #SomeTable (Id int, [date] datetime, tool nvarchar(80), description nvarchar(80))

DECLARE @date AS DATETIME

SET @date = CAST('2013-01-10' as datetime) 

declare @i as int = 0
declare @j as int = 0
declare @k as int = 0

WHILE (@i < 100)
begin
    set @i = @i + 1
    set @j = 0
    WHILE (@j < 100)
    begin
        set @j = @j + 1
        set @k = CAST(RAND() * 100 as int)      
        insert into #SomeTable (Id, [date], tool, description) values (@i*@j, DATEADD(dd,@k,@date), 'tool-' + STUFF('000', 3-LEN(@i)+1, LEN(@i), @i) , 'description-' + CAST(@i as nvarchar(10)) + '-' + CAST(@j as nvarchar(10)))
    end
end
--may be this will be enough
--select *, DATEDIFF(dd, MIN([date]) OVER(PARTITION BY tool), [date]) AS 'days' from #SomeTable order by tool, days
--sql 2012 only
--4 rows window
--select *, DATEDIFF(dd, MIN([date]) OVER(PARTITION BY tool ORDER BY tool, [date] ROWS BETWEEN 4 PRECEDING AND CURRENT ROW), [date]) AS 'days' from #SomeTable order by tool, days
select *, DATEDIFF(dd, MIN([date]) OVER(ORDER BY tool, [date] ROWS BETWEEN 4 PRECEDING AND CURRENT ROW), [date]) AS 'days' from #SomeTable order by tool, days
于 2013-10-01T11:25:16.927 に答える