将其基于重复记录的两列组合组合在一起创建记录,并分配 Min start_date 和 Max end_date

Posted

技术标签:

【中文标题】将其基于重复记录的两列组合组合在一起创建记录,并分配 Min start_date 和 Max end_date【英文标题】:Make a record combining its duplicate records based combination of two columns and assign the Min start_date and Max end_date 【发布时间】:2020-10-09 07:45:25 【问题描述】:

这张图片会告诉你问题的结构

这应该是所需的输出

我想从重复记录中填充 Min Start_DateMax End_Date(重复基于 Present 和 Absent 列)并制作主记录,与 PresentAbsent 列的其他组合相同.

我已按 id 和开始日期排序,以了解数据的行为。 这个场景我只提到了一个 ID,存在的其他 ID 也应该提供相同类型的输出,如果我得到这个示例的有效解决方案,我可以在整个表上实现正确的逻辑。 我尝试过使用窗口功能但没有得到任何解决方案。 提前致谢

请注意,ID 的重复记录数基于存在和不存在列是可变的。

【问题讨论】:

这里的大多数人都希望样本表数据和预期结果为格式化文本,而不是图像(或者更糟糕的是,图像链接)。 您使用的是 Oracle 还是 DB2? 感谢您的宝贵时间。因为我正在学习堆栈文化,所以对此我深表歉意。 是的,我正在使用 oracle,但我必须在 db2 中实现。 第 5 行发生了什么?它只是从结果集中消失了。 【参考方案1】:

这是一个孤岛问题。考虑使用行号之间的差异来构建“相邻”记录组,然后您可以合并:

select id, min(start_date) start_date, max(end_date end_date, present, absent
from (
    select t.*,
        row_number() over(partition by id order by start_date) rn1,
        row_number() over(partition by id, present, absent order by start_date) rn2
    from mytable t
) t
group by id, present, absent, rn1 - rn2
order by 1, 2

【讨论】:

【参考方案2】:

你可以使用MATCH_RECOGNIZE:

SELECT *
FROM   table_name
MATCH_RECOGNIZE (
   PARTITION BY id
   ORDER BY     start_date
   MEASURES     FIRST( start_date ) AS start_date,
                MAX( end_date )     AS end_date,
                FIRST( present )    AS present,
                FIRST( absent )     AS absent
   ONE ROW PER MATCH
   PATTERN      (FIRST_ROW EQUAL_ROWS*)
   DEFINE       EQUAL_ROWS AS
   (
     (
       (
         EQUAL_ROWS.present = PREV(EQUAL_ROWS.present)
       ) OR (
         EQUAL_ROWS.present IS NULL AND PREV(EQUAL_ROWS.present) IS NULL
       )
     ) AND (
       (
         EQUAL_ROWS.absent  = PREV(EQUAL_ROWS.absent)
       ) OR (
         EQUAL_ROWS.absent IS NULL AND PREV(EQUAL_ROWS.absent) IS NULL
       )
     )
   )
)

因此,对于您的示例数据:

CREATE TABLE table_name ( id, start_date, end_date, present, absent ) AS
SELECT 1, DATE '2020-02-01', DATE '2020-03-01', 'Y',  'N'  FROM DUAL UNION ALL
SELECT 1, DATE '2020-03-04', DATE '2020-04-19', 'Y',  'N'  FROM DUAL UNION ALL
SELECT 1, DATE '2020-03-06', DATE '2020-03-09', 'N',  'N'  FROM DUAL UNION ALL
SELECT 1, DATE '2020-05-04', DATE '2020-09-04', 'N',  'Y'  FROM DUAL UNION ALL
SELECT 1, DATE '2020-05-06', DATE '2020-06-26', 'N',  'Y'  FROM DUAL UNION ALL
SELECT 1, DATE '2020-07-12', DATE '2020-08-12', NULL, NULL FROM DUAL UNION ALL
SELECT 1, DATE '2020-08-13', DATE '2020-08-12', NULL, NULL FROM DUAL;

这个输出:

身份证 | START_DATE | END_DATE |礼物 |缺席的 -: | :--------- | :-------- | :-------- | :----- 1 | 20 年 2 月 1 日 | 20 年 4 月 19 日 |是 | ñ 1 | 20 年 3 月 6 日 | 20 年 3 月 9 日 | N | ñ 1 | 20 年 5 月 4 日 | 04-SEP-20 | N |是 1 | 20 年 7 月 12 日 | 20 年 8 月 12 日 | |

db小提琴here

【讨论】:

以上是关于将其基于重复记录的两列组合组合在一起创建记录,并分配 Min start_date 和 Max end_date的主要内容,如果未能解决你的问题,请参考以下文章

如何使用组合框在记录 ms 访问中搜索多个字段?

如何使用 purrr(管道、地图、imaps)将 df 或 tibble 中的两列组合绘制为 R 中的散点图

检查没有原始查询的两列组合

如何根据创建标识符和最大日期的两列选择行

如何自动展开到组合框中的重复条目?

Rails:验证两列的唯一性(一起)