连接两个具有从客户创建日期开始到当前日期结束的连续日期的日期表时遇到问题?
trouble joining two date tables with consecutive dates starting at customer create date and ending at current date?
我在 table 天创建了一个客户 activity,这需要 9 个 CTE。
第一个 table 我想交叉连接所有客户的唯一 ID 与日历的日期 table。因此,每天会有多行具有相同的唯一 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 都有连续的日期,从他们帐户的创建日期(即 3/13/2015)开始到当前日期结束。
创建日期为 Table 1,具有唯一 ID,我加入日期为 table。
我的问题是我无法通过每个唯一 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
这里:
dt2.date <= CURRENT_DATE AND mc.created_at >= dt2.date
由于您想要用户创建日期和今天之间的日期,您可能希望创建日期的不等式条件相反。当我们把下限放在第一位时,我发现更容易理解:
dt2.date >= mc.created_at AND dt2.date <= CURRENT_DATE
关于查询的其他事情:
你本质上想要一个 INNER JOIN
,所以用它代替 CROSS JOIN ... WHERE
;更清晰
ORDER BY
在 cte 中对我来说毫无意义
你真的需要GROUP BY
吗? 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
我在 table 天创建了一个客户 activity,这需要 9 个 CTE。 第一个 table 我想交叉连接所有客户的唯一 ID 与日历的日期 table。因此,每天会有多行具有相同的唯一 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 都有连续的日期,从他们帐户的创建日期(即 3/13/2015)开始到当前日期结束。
创建日期为 Table 1,具有唯一 ID,我加入日期为 table。 我的问题是我无法通过每个唯一 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
这里:
dt2.date <= CURRENT_DATE AND mc.created_at >= dt2.date
由于您想要用户创建日期和今天之间的日期,您可能希望创建日期的不等式条件相反。当我们把下限放在第一位时,我发现更容易理解:
dt2.date >= mc.created_at AND dt2.date <= CURRENT_DATE
关于查询的其他事情:
你本质上想要一个
INNER JOIN
,所以用它代替CROSS JOIN ... WHERE
;更清晰ORDER BY
在 cte 中对我来说毫无意义你真的需要
GROUP BY
吗?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