以下のように、出力の下に表示される 2 つの有効な行のそれぞれに 3 つの行が必要です。
主キーは C_PROCEDURE + C_PROV_TYPE + SPEC_SEQ_NO! 出力はbLOWのようになります
1 に答える
次のようなことを試すことができます:
INSERT INTO YourTable (
C_PROCEDURE,
C_PROV_TYPE,
I_PT_SPEC_SEQ_NO,
C_SPECIALTY
)
SELECT
s.C_PROCEDURE,
s.C_PROV_TYPE,
s.MaxSeq + ROW_NUMBER() OVER (
PARTITION BY s.C_PROCEDURE, s.C_PROV_TYPE
ORDER BY v.rn, s.I_PT_SPEC_SEQ_NO),
s.C_SPECIALTY + v.rn
FROM (
SELECT
*,
MAX(I_PT_SPEC_SEQ_NO) OVER (
PARTITION BY C_PROCEDURE, C_PROV_TYPE
) AS MaxSeq
FROM YourTable
) s
CROSS JOIN (
VALUES (1), (2), (3)
) v (rn)
WHERE s.C_PROV_TYPE = '014'
AND s.C_SPECIALTY = '300'
;
基本的に、サブクエリは、ウィンドウ関数 ( )を使用して、パーティションごとにYourTable
の最大値が指定されたすべての行を返します。I_PT_SPEC_SEQ_NO
(C_PROCEDURE, C_PROV_TYPE)
MAX()
MAX(...) OVER (...)
そのサブクエリの結果のセットは、インラインの 3 行のテーブル (返されたすべての行の 3 つのコピーを生成する) にクロス結合され、指定されたC_PROV_TYPE
およびの値によってフィルター処理されますC_SPECIALTY
。
新しいデータ行は、サブクエリから直接C_PROCEDURE
プルされます。サブクエリの値とインライン テーブルの値を使用して、C_PROV_TYPE
新しいC_SPECIALTY
値が生成されます。rn
新しいシーケンス番号は、ROW_NUMBER()
関数とサブクエリによって返される最大シーケンス番号を使用して生成されます。
DB2 の稼働中のインストールにアクセスできなかったので、SQL Server 2008 でスクリプトをテストし、SQL Server と同様に DB2 がサポートしていることを理解している機能に固執しようとしました。この SQL Fiddle デモでも、SQL Server 2008 インスタンスを使用してクエリの動作を示します。