当前位置: 首页 > 知识库问答 >
问题:

连接两个日期表时出现问题,连续日期从客户创建日期开始,到当前日期结束?

薛宇
2023-03-14

我正在按日创建一个客户活动表,这需要9个CTE。我要交叉的第一个表将所有客户唯一的ID与日历表的日期连接起来。因此,每天都会有多行具有相同的唯一ID。问题是无论以下CTE中的日期如何,都要确保日期是连续的。这是一个简短的例子,看起来像这样:

GUID      DATE       CONDITIONS
1         3/13/2015    [NULL]
1         3/14/2015     Y
1         3/15/2015     [NULL]
....
1         9/2/2020      Y
2         4/15/2015     Y
2         4/16/2015     [NULL]
2         4/17.2015     [NULL]
2         4/18/2015     Y
...
2         9/2/2020      [NULL]

以此类推——这样每个客户的GUID都有连续的日期,从他们账户的创建日期(即2015年3月13日)开始,到当前日期结束。

创建日期在表1中,具有唯一的ID,我将它与一个日期表连接起来。我的问题是,我无法让查询以每个唯一ID的最小创建日期运行。因为如果我不创建最小开始日期,查询将永远运行(它试图为每个连续日期创建每个唯一的ID,甚至在创建客户帐户之前。)

这是我现在的代码。有人能告诉我是否我做对了最小的。创建日期吗?当我运行查询时,它仍然只是超时。

with 
cte_carrier_guid (carrier_guid, email, date, carrier_id) as 
    (
    SELECT
        guid as carrier_guid
        ,mc.email 
        ,dt2.date as date
        ,mc.id as carrier_id
    FROM ctms_db_public.msd_carrier mc
    CROSS JOIN public.dim_calendar dt2
    WHERE dt2.date <= CURRENT_DATE 
    AND mc.created_at >= dt2.date
    GROUP BY guid, mc.id, dt2."date", mc.email
    ORDER BY guid, dt2.date asc
    )
    Select top 10 * from cte_carrier_guid 

共有1个答案

沙富
2023-03-14

在这里:

dt2.date <= CURRENT_DATE AND mc.created_at >= dt2.date

因为您需要用户创建日期和今天之间的日期,您可能需要创建日期上的不等式条件。我发现当我们把下限放在第一位时,更容易理解:

dt2.date >= mc.created_at AND dt2.date <= CURRENT_DATE 

关于查询的其他事项:

>

  • 本质上你需要一个内部连接,所以用它代替交叉连接。。。其中;更清楚

    在cte中按订购对我来说毫无意义

    你真的需要分组吗?SELECT子句中的列与GROUP BY中的列相同,因此这只需要删除潜在的重复项(但为什么会有重复项?)

    你可以把cte说成:

    SELECT ...
    FROM ctms_db_public.msd_carrier mc
    INNER JOIN public.dim_calendar dt2 ON dt2.date >= mc.created_at
    WHERE dt2.date <= CURRENT_DATE 
    

  •  类似资料:
    • 问题内容: 好吧,假设我有一个看起来像这样的表: 任何人都有关于如何查询它的想法,因此数据看起来像 问题答案: 我不会将ID放在这里,因为我认为它与查询无关。如果您愿意,请稍后再说。这是一个MSSQL查询。 可以很容易地将其翻译为其他数据库类型。

    • 问题内容: 我在从表中显示正确的数据时遇到了麻烦。我不太确定要搜索什么。我不确定min(column)或max(column)在这里对我有帮助。让我们看看我是否可以解释我的问题。 我的表包含以下数据: 我将以一种观点来介绍这一点。它将按代码分组。 我想要的是此输出: 如您所见,DateTo和DateFrom之间是否存在间隙,我希望将其显示为两行。但是,如果具有相同代码的下一个“ DateFrom”

    • 问题内容: 如果可能的话,在以下情况下,我希望使用joda或非joda解决方案 假设我的一周从2012年5月2日开始,给定的当前日期为02/22/2011。我需要计算给定当前日期的星期开始和结束日期。因此,我的解决方案的星期应该从02/19开始,而星期在02/25结束。为简单起见,我将我的工作日设置为02/05/2011,但是可能是任何一天,我的工作日始终为7天。 我现有的代码如下,但似乎无法按预

    • 问题内容: 我想检查日期是否在开始日期和结束日期之间。 我添加了一个where子句 但问题在于它不包含“ 2010-04-15”。 它应该包括结束日期,我该怎么办? 请帮我 问候, 潘卡 问题答案: 明确指定时间部分:

    • 问题内容: 我接收到来自Twitter的特定日期以特定格式发送的Twitter消息: 我想将这些日期存储在带有djangos DateTimeField字段的postgresql中的“带有时区的时间戳”字段中。但是,当我存储该字符串时,出现此错误: 我可以自动将twitter datetype转换为python datetime时间(在我的应用程序中的其他地方可以保存日期)。 问题答案: 编写这样

    • 问题内容: 从DATETIME中删除 日期 的最佳方法是什么,以便仅剩下 时间 进行比较? 我知道我可以执行以下操作: 但这涉及转换和字符。如果我想检查DATETIME列中是否存储了另外两个时间之间的时间(包括分钟),是否有一种优雅的方法可以执行此操作而不必依赖转换为字符串? 问题答案: 从Essential SQL Server日期,时间和DateTime函数中 尝试使用TimeOnly函数: