输出下面显示的两个有效行中的每一行都需要3行,如下所示:
主键是C_PROCEDURE + C_PROV_TYPE + SPEC_SEQ_NO! 输出应该像bELOW
答案 0 :(得分:2)
您可以尝试这样的事情:
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
函数({{1})返回为I_PT_SPEC_SEQ_NO
的每个分区提供的最大值(C_PROCEDURE, C_PROV_TYPE)
的所有MAX()
行})。
然后,该子查询的结果集交叉连接到内联3行表(生成返回的每行的三个副本),并按指定的MAX(...) OVER (...)
和C_PROV_TYPE
值进行过滤。
新数据行直接从子查询中提取C_SPECIALTY
和C_PROCEDURE
。新的C_PROV_TYPE
值使用子查询中的值和内联表的C_SPECIALTY
值生成。新的序列号是在rn
函数和子查询返回的最大序列号的帮助下生成的。
由于我无法访问DB2的工作安装,因此我在SQL Server 2008中测试了我的脚本,试图坚持我理解DB2支持的功能以及SQL Server。 This SQL Fiddle demo还使用SQL Server 2008实例来演示查询的工作方式。