
输出下方显示的两个有效行中的每一行都需要 3 行,如下所示:
主键是 C_PROCEDURE + C_PROV_TYPE + SPEC_SEQ_NO!输出应如下所示
你可以尝试这样的事情:
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 行表(生成返回的每一行的三个副本),并按 和 的指定值进行C_PROV_TYPE过滤C_SPECIALTY。
新数据行C_PROCEDURE直接C_PROV_TYPE从子查询中提取。新C_SPECIALTY值是使用来自子查询的rn值和内联表的值生成的。ROW_NUMBER()新的序列号是在函数和子查询返回的最大序列号的帮助下生成的。
由于我无法访问 DB2 的有效安装,因此我在 SQL Server 2008 中测试我的脚本,试图坚持我理解的 DB2 支持的特性以及 SQL Server。此 SQL Fiddle 演示还使用 SQL Server 2008 实例来演示查询的工作方式。