PostgreSQLには「generate_series」という集合を返す関数がいます。
http://www.postgresql.jp/document/pg814doc/html/functions-srf.html
これがうらやましくて、SQLServer用にテーブル値関数を作ってみた(爆
コード
========================================================================
CREATE FUNCTION GENERATE_SERIES(@start int, @end int, @step int = 1)
RETURNS @ret TABLE (num int)
BEGIN
DECLARE @counter int ;
IF (@step = 0 )
RETURN ;
IF ( @start > @end AND @step > 0 ) OR
( @start < @end AND @step < 0 )
BEGIN
SET @counter = @end ;
SET @end = @start ;
END;
ELSE
SET @counter = @start ;
WHILE ( @step > 0 AND @counter <= @end ) OR
( @step < 0 AND @counter >= @end )
BEGIN
insert into @ret values(@counter);
SET @counter = @counter + @step ;
END ;
RETURN ;
END;
========================================================================
使用
========================================================================
デフォルトのステップ数1を使用して1から4までの数値
select * from GENERATE_SERIES(1,4,default);
1から3までの数値でステップ数2
select * from GENERATE_SERIES(1,3,2);
5から1までの数値でステップ数2(1から5まででステップ数2として動く)
select * from GENERATE_SERIES(5,1,2);
1から5までの数値でステップ数3(5はでないよ~)
select * from GENERATE_SERIES(1,5,3);
5から1までの数値でステップ数-1
select * from GENERATE_SERIES(5,1,-1);
1から5までの数値でステップ数-1(5から1まででステップ数ー1)
select * from GENERATE_SERIES(1,5,-1);
========================================================================
なんか、ちょっと違うものになったけど・・・・。
こいつとテーブルをうまく繋げて使うと面白いことになるのかなぁ・・・・?
ROW_NUMBERがSQLServer2005から出てきて、ちょっと存在価値薄いけど
たとえばこんな使用方法があったりする。
select cast('2006-01-01' as datetime) + num from GENERATE_SERIES(0,30,default);
|
2006-01-01 00:00:00.000 |
2006-01-02 00:00:00.000 |
2006-01-03 00:00:00.000 |
(中略) |
2006-01-30 00:00:00.000 |
2006-01-31 00:00:00.000 |
この情報とテーブルの日付をOUTER JOINなどして1ヶ月間のデータを作り出すとか
まぁ、使い方はそんな感じ?
ステップを7にして、基準の日付を日曜にすると、
日曜日だらけの日付が取れるとか、ちょっと楽しい?