BGC*_*CDC 4 postgresql postgresql-9.6
我们正在迁移到新的记录管理系统,我正在解决数据迁移的问题。源数据和目标数据都在Postgresql中
在源数据库中,对于同一供应商的每个授权代码以及该授权的开始和结束日期,我们有多个行。
+----------+---------------+------------+-----------+
| Vendor | Authorization | Start Date | End Date |
+----------+---------------+------------+-----------+
| Vendor 1 | ##### | 1/1/2017 | 2/28/2017 |
| Vendor 1 | ##### | 3/1/2017 | 4/15/2017 |
| Vendor 2 | ##### | 4/16/2017 | 5/31/2017 |
| Vendor 2 | ##### | 6/1/2017 | 7/12/2017 |
| Vendor 1 | ##### | 7/13/2017 | 9/30/2017 |
+----------+---------------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)
在目标数据库中,我们有给定时间的活动供应商关系的记录,以及开始日期和结束日期。(Auth # 开始和结束日期单独跟踪)迁移后,前面列出的示例应如下所示。
+----------+------------+-----------+
| Vendor | Start Date | End Date |
+----------+------------+-----------+
| Vendor 1 | 1/1/2017 | 4/15/2017 |
| Vendor 2 | 4/16/2017 | 7/12/2017 |
| Vendor 1 | 7/13/2017 | 9/30/2017 |
+----------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)
我认为我应该能够完成将表连接回自身 n-1 次,其中 n 是同一供应商的连续授权号的最大数量,可能约为 10,这是可行的,但绝对不是优选的。
是否有更常见的方法按连续的开始和结束日期对数据进行分组?
您可以通过以下方式使用 GROUPING AND WINDOW 解决方案:
\n\n\n\n\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n\ncreate table tbl (vendor text, auth text, StartDate Date, EndDate Date);\n
\n\xe2\x9c\x93\n\n
\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n\ninsert into tbl values\n(\'Vendor 1\', \'#####\', \'20170101\', \'20170228\'),\n(\'Vendor 1\', \'#####\', \'20170301\', \'20170415\'),\n(\'Vendor 2\', \'#####\', \'20170416\', \'20170531\'),\n(\'Vendor 2\', \'#####\', \'20170601\', \'20170712\'),\n(\'Vendor 1\', \'#####\', \'20170703\', \'20170930\');\n
\n受影响的 5 行\n\n
\n\n\nRun Code Online (Sandbox Code Playgroud)\n\nselect vendor, min(startdate) as startdate, max(enddate) as enddate, grp\nfrom (\n select vendor, auth, startdate, enddate, \n sum(rst) over (order by vendor, startdate) as grp\n from (\n select vendor, auth, startdate, enddate, \n case when coalesce(lag(enddate) over (partition by vendor order by vendor, startdate), startdate) + 1 <> startdate then 1 end rst\n from tbl\n ) t1\n ) t2\ngroup by grp, vendor\norder by startdate\n
\n供应商 | 开始日期 | 结束日期 | grp\n:------- | :--------- | :--------- | --:\n供应商 1 | 2017-01-01 | 2017-04-15 | 1\n供应商 2 | 2017-04-16 | 2017-07-12 | 3\n供应商 1 | 2017-07-03 | 2017-09-30 | 2\n\n
db<>在这里摆弄
\n