夏椰の東屋

- お遊び記録 -

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  108  : 記事  1  : コメント  3915  : トラックバック  30

ニュース


落書きしてね♪

IAM
僕がとった写真です。
ご自由にお使いください。

フィードメーター - 夏椰の東屋 track feed
広告


記事カテゴリ

書庫

日記カテゴリ

Other Site From Kaya

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);
num
1
2
3
4

 

1から3までの数値でステップ数2

select * from GENERATE_SERIES(1,3,2);

num
1
3

 

5から1までの数値でステップ数2(1から5まででステップ数2として動く)

select * from GENERATE_SERIES(5,1,2);

num
1
3
5

 

1から5までの数値でステップ数3(5はでないよ~)

select * from GENERATE_SERIES(1,5,3);

num
1
4

5から1までの数値でステップ数-1

select * from GENERATE_SERIES(5,1,-1);

num
5
4
3
2
1

 

1から5までの数値でステップ数-1(5から1まででステップ数ー1)

select * from GENERATE_SERIES(1,5,-1);

num
5
4
3
2
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にして、基準の日付を日曜にすると、

日曜日だらけの日付が取れるとか、ちょっと楽しい?

 

投稿日時 : 2006年9月25日 0:53

コメント

# CROSS APPLYで遊び♪ 2006/10/06 1:39 夏椰の東屋
CROSS APPLYで遊び♪

# ある項目ごとに最小値の値をもつレコードを取得する処理を考えてみた。 2007/02/08 2:13 夏椰の東屋
ある項目ごとに最小値の値をもつレコードを取得する処理を考えてみた。

# ランダムで遊んでみた 2007/10/11 13:57 夏椰の東屋
ランダムで遊んでみた

# 付加列インデクスで遊んでみました。 2007/10/11 14:38 夏椰の東屋
付加列インデクスで遊んでみました。

Post Feedback

タイトル
名前
Url:
コメント