Python 查找两个日期之间的日期范围,然后重复列

Python 查找两个日期之间的日期范围,然后重复列,python,sql,Python,Sql,我想要输出,因为日期范围B和C之间的所有月份都应该在该日期范围内重复,如: A B C 0 10062-35551-49007-45097 8/31/2014 0:00 233 1 10062-35551-49007-45097 10/31/2014 0:00 14 2 10062-35551-49007-45097 12/31/2014 0:00 22 解决这个问题的一个典型方法是首先创建一个引用表

我想要输出,因为日期范围B和C之间的所有月份都应该在该日期范围内重复,如:

    A                       B               C
0   10062-35551-49007-45097 8/31/2014 0:00  233
1   10062-35551-49007-45097 10/31/2014 0:00 14
2   10062-35551-49007-45097 12/31/2014 0:00 22

解决这个问题的一个典型方法是首先创建一个引用表来保存月末日期列表。虽然这似乎是一个额外的工作开始,这有一个优势,使查询更容易编写,主要是RDBMS独立

假设我们创建表all_dates并存储2014年的所有月末日期:

    A                       B               C
0   10062-35551-49007-45097 8/31/2014 0:00  233
1   10062-35551-49007-45097 9/30/2014 0:00  233
2   10062-35551-49007-45097 10/31/2014 0:00 14
3   10062-35551-49007-45097 11/30/2014 0:00 14
4   10062-35551-49007-45097 12/31/2014 0:00 22
现在我们可以编写一个查询:

根据原始表格B列中的最小值和最大值选择相关日期范围 使用NOT EXISTS条件将每个月末日期联接到原始表中的相关记录 SQL:

PS:因为您没有说明您使用的是哪种RDBMS,所以我选择了MySQL;您可能需要根据实际用例修改创建all_tables引用表的代码,但最终查询很可能保持不变

额外好处:这里有一个查询,可以正确处理在a列中存在多个不同值的用例:


解决这个问题的一个典型方法是首先创建一个引用表来保存月末日期列表。虽然这似乎是一个额外的工作开始,这有一个优势,使查询更容易编写,主要是RDBMS独立

假设我们创建表all_dates并存储2014年的所有月末日期:

    A                       B               C
0   10062-35551-49007-45097 8/31/2014 0:00  233
1   10062-35551-49007-45097 9/30/2014 0:00  233
2   10062-35551-49007-45097 10/31/2014 0:00 14
3   10062-35551-49007-45097 11/30/2014 0:00 14
4   10062-35551-49007-45097 12/31/2014 0:00 22
现在我们可以编写一个查询:

根据原始表格B列中的最小值和最大值选择相关日期范围 使用NOT EXISTS条件将每个月末日期联接到原始表中的相关记录 SQL:

PS:因为您没有说明您使用的是哪种RDBMS,所以我选择了MySQL;您可能需要根据实际用例修改创建all_tables引用表的代码,但最终查询很可能保持不变

额外好处:这里有一个查询,可以正确处理在a列中存在多个不同值的用例:


请用您正在使用的RDBMS标记您的问题:oracle、mysql、sql server……?请用您正在使用的RDBMS标记您的问题:oracle、mysql、sql server……?b列包含1975年至2019年的日期,所以不可能为所有这些创建一个参考表years@HermantKumar:大约要创建500条记录,您应该能够使用您选择的工具(例如Excel)自动生成插入命令。在我看来,与编写和维护一个更复杂的查询相比,采取这种一次性操作没有那么痛苦和容易出错……是的,这是有道理的,如果我2 10062-35551-49007-45097 12/31/2014 0:00 22在以下列中有不同的A值会怎样:A B C 0 10062-35551-49007-45097 8/31/2014 0:00 233 1 10062-35551-49007-45097 10/31/2014 0:00 14 2 10062-35551-49007-45097 12/31/2014 0:00 22 3 10062-35551-49007-45007-45028 12/31/2015 12 3sql中的10062-35551-49007-45028 12/31/2016 23server@HemantKumar:说得好,我更新了我的答案,对该用例的查询进行了轻微修改。b列包含1975年到2019年的日期,因此不可能为所有这些日期创建一个参考表years@HermantKumar:大约要创建500条记录,例如,您应该能够使用您选择的工具Excel自动生成INSERT命令。在我看来,与编写和维护一个更复杂的查询相比,采取这种一次性操作没有那么痛苦和容易出错……是的,这是有道理的,如果我2 10062-35551-49007-45097 12/31/2014 0:00 22在以下列中有不同的A值会怎样:A B C 0 10062-35551-49007-45097 8/31/2014 0:00 233 1 10062-35551-49007-45097 10/31/2014 0:00 14 2 10062-35551-49007-45097 12/31/2014 0:00 22 3 10062-35551-49007-45007-45028 12/31/2015 12 3sql中的10062-35551-49007-45028 12/31/2016 23server@HemantKumar:说得好,我更新了我的答案,对该用例的查询进行了轻微修改。
SELECT t.A, d.dt B, t.C
FROM 
    all_dates d
    INNER JOIN (
        SELECT MIN(B) minb, MAX(B) maxb FROM mytable
    ) trange  
        ON d.dt >= trange.minb AND d.dt <= trange.maxb 
    INNER JOIN mytable t
        ON t.B <= d.dt
        AND NOT EXISTS (
            SELECT 1 
            FROM mytable t1
            WHERE t1.B <= d.dt AND t1.B > t.B
        )
| A                       | B           | C   |
| ----------------------- | ----------- | --- |
| 10062-35551-49007-45097 | 2014-08-31  | 233 |
| 10062-35551-49007-45097 | 2014-09-30  | 233 |
| 10062-35551-49007-45097 | 2014-10-31  | 14  |
| 10062-35551-49007-45097 | 2014-11-30  | 14  |
| 10062-35551-49007-45097 | 2014-12-31  | 22  |
SELECT t.A, d.dt B, t.C
FROM 
    all_dates d
    INNER JOIN (
        SELECT A, MIN(B) minb, MAX(B) maxb 
        FROM mytable
        GROUP BY A
    ) trange  
        ON d.dt >= trange.minb AND d.dt <= trange.maxb 
    INNER JOIN mytable t
        ON trange.A = t.A
        AND t.B <= d.dt
        AND NOT EXISTS (
            SELECT 1 
            FROM mytable t1
            WHERE 
                t1.A = t.A 
                AND t1.B <= d.dt 
                AND t1.B > t.B
        )