输出下方显示的两个有效行中的每一行都需要 3 行,如下所示:
主键是 C_PROCEDURE + C_PROV_TYPE + SPEC_SEQ_NO!输出应如下所示
问问题
56 次
1 回答
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
提供最大值的所有行。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 实例来演示查询的工作方式。
于 2012-10-08T05:44:41.723 回答