【问题标题】:Oracle SQL data migration based on start and end date基于开始和结束日期的 Oracle SQL 数据迁移
【发布时间】:2021-01-11 21:57:45
【问题描述】:

正在将旧系统数据迁移到新系统。

我需要根据 id 和 name 对数据进行分组。 我们需要将开始日期作为最小日期,将结束日期作为最大日期。 如果任何 id 和 name 组合包含属于同一时期。我们可以避免重复并选择从最低到最高的日期。

旧系统

新系统预期

ID - 139247 包含基于名称的重复行。

已添加数据 - https://dbfiddle.uk/?rdbms=oracle_18&fiddle=8d6877847c5e052adf703430b5c7f083

如果需要更多详细信息,请告诉我。提前致谢。

【问题讨论】:

    标签: sql oracle12c


    【解决方案1】:

    这是一种孤岛问题。因为您想要任何重叠,所以我会使用先前 enddate 的累积最大值来确定岛屿的位置:

    select id, name, min(startdate) as startdate,
           (case when count(enddate) = count(*) then max(enddate)
            end) as enddate
    from (select t.*,
                 sum(case when prev_enddate >= startdate then 0 else 1 end) over (partition by id, name) as grp
          from (select t.*,
                       max(enddate) over (partition by id, name order by startdate range between unbounded preceding and interval '1' day preceding) as prev_enddate
                from t
               ) t
          ) t
    group by id, name, grp
    order by name, startdate;
    

    Here 是一个 dbfiddle。

    【讨论】:

    • 感谢您的回答@Gordon Linoff。它不适合我。 dbfiddle.uk/…
    • @Abdul 。 . .您小提琴中的查询不是此答案中的查询。无论如何,我修正了错别字并添加了一个 dbfiddle.
    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多