テーブルから集計を作成したいが、解決策を見つけることができない。変数を基にした複製によるtsqlグループ化
例テーブル:その時点で既存の一人一人のために
DECLARE @MyTable TABLE(person INT, the_date date, the_value int)
INSERT INTO @MyTable VALUES
(1,'2017-01-01', 10),
(1,'2017-02-01', 5),
(1,'2017-03-01', 5),
(1,'2017-04-01', 10),
(1,'2017-05-01', 2),
(2,'2017-04-01', 10),
(2,'2017-05-01', 10),
(2,'2017-05-01', 0),
(3,'2017-01-01', 2)
、私は最後のx(@months_back)の値を平均化したいいくつかの開始日(@start_date)与えヶ月:
DECLARE @months_back int, @start_date date
set @months_back = 3
set @start_date = '2017-05-01'
SELECT person, avg(the_value) as avg_the_value
FROM @MyTable
where the_date <= @start_date and the_date >= dateadd(month, [email protected]_back, @start_date)
group by person
これは機能します。私は今再び同じことをしたいが、開始日から数ヶ月(@month_skip)をスキップする。そして、私はそれらの2つのテーブルを一緒に結合したい。次に、この日からもう一度@month_skip月をスキップして同じことをしたいと思います。指定された日付(@min_date)にスキップするまで、これをやり続けます。
@MyTable結果がでなければなりません上記の変数とテーブルを使用してDECLARE @months_back int, @month_skip int, @start_date date, @min_date date
set @months_back = 3
set @month_skip = 2
set @start_date = '2017-05-01'
set @min_date = '2017-03-01'
:
person | avg_the_value
1 | 5
2 | 6
1 | 6
3 | 2
つだけのスキップが@min_dateが2ヶ月前であるので、ここで作られているが、私は行うことができるようにしたいと思います@min_dateに基づいて複数のスキップが行われます。
この例の表はシンプルですが、実際の列は自動的に多くの列が作成されるため、結果の表のスキームを宣言しなければならない表変数を使用することは現実的ではありません。
私は関連する質問Hereを尋ねましたが、この問題の回答を得ることはできませんでした。
日付(例えば、2017年5月1日)から開始し、バック@months_back
ヶ月を見て、日付の範囲を定義します。
なぜ人1はあなたの期待される出力に2つの結果を持っていますか? 'GROUP BY person'を使用している場合は、1行になります。あなたは説明できますか? – Larnu
@Larnu beacase私は、クエリの例の複数の結果を結合したいと思います。予想される出力では、人1の最初の行は2017-05-01および3ヶ月前の平均値で、2番目の値は2017-03-01および3ヶ月前の値です – Jarnald
どのバージョンのSQL Serverを使用していますか?一部のバージョンでは、これを実行するのに役立つグループ化とウィンドウ/インターバル機能にアクセスできます。 – lyrisey