【发布时间】:2021-12-13 08:59:36
【问题描述】:
我有一个大型(15m 行)csv 文件,其中一些 ID 具有多个期限(STRT_DTE 和 EXP_DATE)。我还有一个名为 TRM_NBR 的列,可以取值 1、2、3 等。连续的 TRM_NBR 表示连续的术语周期(即,具有相同 ID 的三行和 TRM_NBR 1、2、3 是一个连续周期,而 1、2、 1 是两个句号)。
我需要减少 csv 文件,以便每个连续的期限(和 ID)有一行。请参见下面的示例。具体来说,我需要输出序列中first term的ID、STRT_DTE,以及序列last term的EXP_DTE。 (保留 TRM_NBR 是可选的。)
原始数据:
ID;TRM_NBR;STRT_DTE;EXP_DTE
000020000007;1;2017-08-22 00:00:00.000;2016-09-20 00:00:00.000
000020000009;1;2015-07-23 00:00:00.000;2015-03-24 00:00:00.000
000020000017;1;2014-10-02 00:00:00.000;2014-10-02 00:00:00.000
000020000063;1;2018-11-19 00:00:00.000;2018-11-19 00:00:00.000
000020000063;2;2020-11-19 00:00:00.000;2020-11-19 00:00:00.000
000020000356;1;2020-06-23 00:00:00.000;2020-06-23 00:00:00.000
000020000356;2;2021-05-20 00:00:00.000;2021-05-20 00:00:00.000
000020000356;3;2022-04-21 00:00:00.000;2021-10-21 00:00:00.000
000020000356;2;2014-07-22 00:00:00.000;2014-09-09 00:00:00.000
000020000356;3;2015-07-21 00:00:00.000;2015-07-21 00:00:00.000
000020000356;4;2016-07-12 00:00:00.000;2016-07-12 00:00:00.000
000020000356;5;2017-07-11 00:00:00.000;2017-07-11 00:00:00.000
期望的输出:
ID;TRM_NBR;STRT_DTE;EXP_DTE
000020000007;1;2017-08-22 00:00:00.000;2016-09-20 00:00:00.000
000020000009;1;2015-07-23 00:00:00.000;2015-03-24 00:00:00.000
000020000017;1;2014-10-02 00:00:00.000;2014-10-02 00:00:00.000
000020000063;1;2018-11-19 00:00:00.000;2020-11-19 00:00:00.000
000020000356;1;2020-06-23 00:00:00.000;2021-10-21 00:00:00.000
000020000356;2;2014-07-22 00:00:00.000;2017-07-11 00:00:00.000
连续的周期可以从 1 到无穷大,可能以 1 开头,也可能不以 1,但总是以 1 递增(如果有不止一行)。输出文件可以包含相同 ID(但序列不同)的多行。您可以假设文件按顺序正确排序。
我可以使用 Python、MySQL 或 Mac Terminal 工具来解决。
【问题讨论】:
-
连续的周期可以从 1 到无穷大,可以从 1 开始,也可以不从 1 开始,但总是以 1 递增(如果有不止一行)。 (1)一个连续时期的行在您的 CSV 中是否总是连续和相邻的?如果同一 ID 有 TRM_NBR 1,2,3,4,我们如何定义这是一个周期还是两个周期,它们之间根本没有其他行?
-
连续的行总是相邻的。这就是我在最后一句中试图表达的意思:“您可以假设文件按顺序正确排序。”您可以假设如果没有重复值(即 1,1 或 2,2),则它是一个序列 - 即 1,2,3,4 将始终是一个连续序列。
-
我可以给你一个 MySQL 的解决方案。但是你必须定义你的 MySQL 服务器的精确版本。
-
干杯。版本 8.0.25
-
再澄清一点:我写了“您可以假设如果没有重复值(即 1,1 或 2,2),那么它是一个序列 - 即 1,2 ,3,4 将始终是一个连续的序列。”但除了重复值之外,新序列还可以以递减值开始(即 1、2、3、2)。