SQL Serverで前レコードの値を参照する②
前回、ROW_NUMBERを使った前レコードの値を参照するSQLを紹介しましたが、別の方法を紹介します。
コーディング例
BEGIN CREATE TABLE #勤怠( 氏名 VARCHAR(10) ,年月 INT ,日 INT ,勤務時間 INT ); INSERT INTO #勤怠 VALUES ('佐藤',201909,1,500) ,('佐藤',201909,2,550) ,('佐藤',201909,3,0) ,('山本',201909,1,0) ,('山本',201909,2,460) ,('山本',201909,3,510) ,('田中',201909,1,520) ,('田中',201909,2,620) ,('田中',201909,3,0) ; SELECT 氏名 ,日 ,勤務時間 ,ISNULL(SUM(日) OVER (PARTITION BY 氏名 ORDER BY 日 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING),0) AS [前日] FROM #勤怠 WHERE 年月 = 201909 GROUP BY 氏名 ,勤務時間 ,日 ORDER BY 氏名 ,日 ; DROP TABLE #勤怠; END
実行結果
氏名 | 日 | 勤務時間 | 前日 |
---|---|---|---|
佐藤 | 1 | 500 | 0 |
佐藤 | 2 | 550 | 1 |
佐藤 | 3 | 0 | 2 |
山本 | 1 | 0 | 0 |
山本 | 2 | 460 | 1 |
山本 | 3 | 510 | 2 |
田中 | 1 | 520 | 0 |
田中 | 2 | 620 | 1 |
田中 | 3 | 0 | 2 |
コーディングの27行目では、OVER句で「ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING」を指定していますが、構文としては「ROWS BETWEEN A AND B」となり、「PRECEDING」は日本語訳すると「先行する」という意味で、「1 PRECEDING」は「1つ前」という意味となります。
よって、「ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING」で「1つ前のレコードから1つ前のレコード」という意味となり、前レコードを参照できます。
注意点としては、複数レコードから抽出した1レコードに対して「ROWS BETWEEN A AND B」を使用しても、前レコードが抽出されていないので、前レコードを参照することはできません。
前レコードを参照するためには、前レコードも抽出する必要があります。
以上、「SQL Serverで前レコードの値を参照する②」の紹介でした。