を構築:id
は、パーティション変数であるSQL Serverウィンドウ機能:私はこのようになり、長手方向のデータのテーブル持っている歴史の文字列
、period
するのは時間の次元で、かつval
です観測値
は、私はSQLのウィンドウ関数ではなく、カーソルでこれをやろうとしているが、問題は:
は、私はこのように、id
の各パネルのためval
の歴史を構築したいです私は、列定義のhist
の自己参照の性質を守っています。 1つの行/列を1つの期間ごとに作成する必要があるようです。例えば、私が来ることができる最も近いこのでした:
IF OBJECT_ID('dbo.my_try', 'U') IS NOT NULL
DROP TABLE dbo.my_try;
GO
SELECT
id, period, val,
CASE
WHEN (
period = MIN(period)
OVER (PARTITION by id order by period ROWS
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
) THEN CAST (val AS VARCHAR(60))
ELSE NULL
END AS hist
INTO my_try
FROM my_test
SELECT
id, period, val,
CASE
WHEN (
period = MIN(period) OVER
(PARTITION by id order by period ROWS
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
) THEN hist
ELSE (
CONCAT(
val, ' | ', LAG(hist, 1) OVER (PARTITION by id order by period)
)
)
END AS hist2
FROM my_try
私はそれが最終的に動作するために反復を行うスプールとhist3
などを行う必要があります。
これをSQLウィンドウ関数で実行することは可能ですか、またはカーソルが唯一のルートですか?
ここではサンプルデータ
は、元のテーブルを生成するためのいくつかのコードです:
CREATE TABLE my_test (
id INT,
period INT,
val INT
)
BEGIN
DECLARE @id INT = 1;
DECLARE @period INT = 1;
WHILE @id <= 3
BEGIN
SET @period = 1
WHILE @period <= 3
BEGIN
INSERT INTO my_test VALUES (@id, @period, @period * POWER(10, @id))
SET @period = @period + 1
END
SET @id = @id + 1
END
END
は再帰CTEのように見える再帰クエリを使用してみてください。サンプルデータを消耗品フォーマットで掲載して、すべてを入力する必要はありませんか?スクリーンショットデータの作成方法は?または、削除したいカーソルを使用していました。 –
ええ、再帰的クエリは解決策です。しかし、SQL Server 2017を使用している場合は、文字列[string_agg](https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql)の集約関数があります。 – Irdis
@SeanLangeサンプルデータを生成するためのコードをいくつか掲載しました。希望の結果のスクリーンショットについては、私はそれを手動で作成しました。 Thx –