SQL Server の LAG 関数で 1 行前の行を取得する

 SQL Server でウィンドウ関数を使い,1行前の行を取得するではウィンドウ関数を用いて1行前の行を取得した.今回は LAG 関数を用いて1行前の行を取得する.

EMERGENCYDB の Temperature テーブル定義

USE [EMERGENCYDB]
GO
CREATE TABLE [dbo].[Temperature](
	[年月日] [date] NOT NULL,
	[都道府県] [nvarchar](50) NOT NULL,
	[日別最高気温] [float] NOT NULL,
	[都道府県コード] [nvarchar](2) NOT NULL
) ON [PRIMARY]
GO

クエリ

 下記クエリを発行して結果を得る.LAG 関数は前の行を,LEAD 関数は後の行を取得する.

USE EMERGENCYDB;
GO
SELECT	
	年月日
,	都道府県
,	LAG(日別最高気温, 1)	OVER (PARTITION BY 都道府県コード	ORDER BY 都道府県コード, 年月日)	AS	前日最高気温
,	日別最高気温
,	LEAD(日別最高気温,1)	OVER (PARTITION BY 都道府県コード	ORDER BY 都道府県コード, 年月日)	AS	翌日最高気温
FROM	dbo.Temperature
(111708 行処理されました)

結果

 結果が取得されている.最初の5行だけ示す.

年月日	都道府県	前日最高気温	日別最高気温	翌日最高気温
2008-04-01	北海道	NULL	4.3	8.4
2008-04-02	北海道	4.3	8.4	9.8
2008-04-03	北海道	8.4	9.8	11.8
2008-04-04	北海道	9.8	11.8	9.8
2008-04-05	北海道	11.8	9.8	14.5

まとめ

 n 行前の行を取得するには MAX 関数などの極値関数を用いる方法と,LAG 関数を用いる方法とがある.n 行前後を求めるだけならいずれでも良いが,汎用性を考えると極値関数を用いて ROWS BETWEEN 句を用いる方法を覚えたほうが良いだろう.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください