【发布时间】:2021-08-05 18:45:14
【问题描述】:
我有一个大型(5.7 亿行)每日状态表,可供 10 万以上的用户使用。目前它在 MySQL(或 CSV)中。该表包含三列:user_id、状态和日期。理想情况下,我想将表简化为一个新表,其中包括每个状态周期的 user_id、status、start_date、end_date(其中一个周期至少是一个日期)。
挑战在于用户可以在状态之间来回切换:我不能假设一个时期被定义为给定状态的最小日期和最大日期之间的差异。
我可以使用 MySQL、Python 或终端 (mac) 中的解决方案。
当前数据:
user_id, status, date
1, GRE, 2018-09-02
1, GRE, 2018-09-03
1, PRO, 2018-09-04
1, PRO, 2018-09-05
1, PRO, 2018-09-06
1, GRE, 2018-09-07
1, GRE, 2018-09-08
1, GRE, 2018-09-09
1, GRE, 2018-09-10
所需的新格式:
user_id, status, start_date, end_date
1, GRE, 2018-09-02, 2018-09-03
1, PRO, 2018-09-04, 2018-09-06
1, GRE, 2018-09-07, 2018-09-10
【问题讨论】:
-
我用的是8.0.15版
-
没有唯一的主键。加载 CSV 文件(从外部源)后,我只在 user_id 上添加了一个索引。如果您的解决方案需要,我可以将唯一索引列添加到 CSV 并重新加载数据。
-
此时它是日期和 user_id 的组合(每个用户每天只有一条记录 - 从每个用户的开始日期开始)。
-
所有这些人都花时间来帮助你。我认为不以某种方式承认他们的努力很奇怪。
-
我不反对,非常感谢大家付出的时间和努力。我只是认为最好的做法是避免“不相关”的 cmets。作为记录,我选择了你提供的 MySQL 解决方案,因为它更容易实现(尽管查询需要很多小时才能运行)。我相信 Python 的建议也会奏效。