我有两个表:
and
我想两个创建一个表,其中对于每个CustomerID,每个Product_Interest都连接到Lead_Source,该Lead_Source是最近的日期(但不晚于此)。决赛桌将是:
到目前为止,我可以加入表格,并创建一个新字段来计算最接近的日期而不用重复,但是当我尝试使用Min进行分组时,我仍然会获得多个排列(每个Lead_Date到每个Product_Interest)。这是代码:
SELECT Min(Int(Abs([Test_PI]![Product_Interest_Date]-[Test_Leads]![Lead_Date])))
AS Lead_PI_Link,
Test_Leads.CustomerID,
Test_PI.Product_Interest_Date,
Test_PI.Product_Interest,
Test_Leads.Lead_Date,
Test_Leads.Lead_Source
FROM Test_Leads INNER JOIN Test_PI ON Test_Leads.CustomerID = Test_PI.CustomerID
GROUP BY Test_Leads.CustomerID,
Test_PI.Product_Interest_Date,
Test_PI.Product_Interest,
Test_Leads.Lead_Date,
Test_Leads.Lead_Source
HAVING (((Test_Leads.CustomerID)="C6UJ9A002Q2P"));
该CustomerID在Test_Leads中有4个条目,在Product_Interest中有4个条目。该查询的结果提供了16个结果,而不是所需的4个结果。如果日期完全匹配,我可以添加一个条件,使日期差为“0”,但是,有时这些日期会偏移1天,有时很多天。
我正在使用Access,并且希望使用“本机”解决方案,但现在可以解决任何问题!
Test_PI
CustomerID Product_Interest_Date Product_Interest
---------- --------------------- ----------------
1 2014-09-07 Interest1
1 2014-09-08 Interest2
1 2014-09-15 Interest3
1 2014-09-28 Interest4
Test_Leads
CustomerID Lead_Date Lead_Source
---------- ---------- -----------
1 2014-09-07 Source1
1 2014-09-14 Source2
2 2014-09-15 Source3
1 2014-09-21 Source4
这里的技巧是使用不相等的联接作为子查询的一部分,以标识每个Product_Interest_Date的最新Lead_Date。查询
SELECT
pi.CustomerID,
pi.Product_Interest_Date,
l.Lead_Date
FROM
Test_PI pi
INNER JOIN
Test_Leads l
ON pi.CustomerID = l.CustomerID
AND pi.Product_Interest_Date >= l.Lead_Date
returns
CustomerID Product_Interest_Date Lead_Date
---------- --------------------- ----------
1 2014-09-07 2014-09-07
1 2014-09-08 2014-09-07
1 2014-09-15 2014-09-07
1 2014-09-15 2014-09-14
1 2014-09-28 2014-09-07
1 2014-09-28 2014-09-14
1 2014-09-28 2014-09-21
请注意,对于09-15如何返回两个匹配项,对于09-28如何返回三个匹配项。我们只对最新查询感兴趣,因此我们将对该查询进行一些调整
SELECT
pi.CustomerID,
pi.Product_Interest_Date,
Max(l.Lead_Date) AS MaxOfLead_Date
FROM
Test_PI pi
INNER JOIN
Test_Leads l
ON pi.CustomerID = l.CustomerID
AND pi.Product_Interest_Date >= l.Lead_Date
GROUP BY
pi.CustomerID,
pi.Product_Interest_Date
which returns
CustomerID Product_Interest_Date MaxOfLead_Date
---------- --------------------- --------------
1 2014-09-07 2014-09-07
1 2014-09-08 2014-09-07
1 2014-09-15 2014-09-14
1 2014-09-28 2014-09-21
现在,我们可以将两个表与该查询一起加入,以将其全部组合在一起
SELECT
Test_PI.CustomerID,
Test_PI.Product_Interest_Date,
Test_PI.Product_Interest,
Test_Leads.Lead_Date,
Test_Leads.Lead_Source
FROM
(
Test_PI
INNER JOIN
(
SELECT
pi.CustomerID,
pi.Product_Interest_Date,
Max(l.Lead_Date) AS MaxOfLead_Date
FROM
Test_PI pi
INNER JOIN
Test_Leads l
ON pi.CustomerID = l.CustomerID
AND pi.Product_Interest_Date >= l.Lead_Date
GROUP BY
pi.CustomerID,
pi.Product_Interest_Date
) latest
ON Test_PI.CustomerID = latest.CustomerID
AND Test_PI.Product_Interest_Date = latest.Product_Interest_Date
)
INNER JOIN
Test_Leads
ON Test_Leads.CustomerID = latest.CustomerID
AND Test_Leads.Lead_Date = latest.MaxOfLead_Date
返回
CustomerID Product_Interest_Date Product_Interest Lead_Date Lead_Source
---------- --------------------- ---------------- ---------- -----------
1 2014-09-07 Interest1 2014-09-07 Source1
1 2014-09-08 Interest2 2014-09-07 Source1
1 2014-09-15 Interest3 2014-09-14 Source2
1 2014-09-28 Interest4 2014-09-21 Source4
问题内容: 我有以下postgresql语法,该语法返回WHERE session_date与$ date_string匹配的值 问题是有时$ date_string在表中不可用,所以我想返回最接近$ date_string的日期。 有什么想法可以做到这一点吗? 问题答案: 如果您想要最近的日期,请按照以下方式进行操作: 之后的最接近日期使用类似的逻辑。 对于最接近的一方:
问题内容: 我刚刚从Gord Thompson那里得到了一个类似问题的大力帮助(通过在同一日期或最接近的先前日期(不仅是完全匹配)进行联接来合并两个表),但现在意识到我的数据不是我所期望的。事实证明,我的Lead_Dates可以晚于Product_Interest_Dates,这导致先前的SQL代码删除了这些情况。进一步来说: 我有两个表: 顾客ID Lead_Date Lead_Source 和
如何向MaterialDatePicker添加约束以强制用户选择仅介于两个日期之间的日期?
问题内容: 给定此基准日期: 我想在列表中找到一个包含最接近日期的元组,但是它不能是更早的日期。 所以这里的输出应该是(它不能是第三个元组,因为那里的日期早于基准日期) 我的问题是,是否存在用于此类日期比较的任何模块?我试图先将所有数据更改为格式,然后进行比较,但是我的代码变得很丑陋,而且切片很多。 @编辑: 要测试的大清单: 要测试的大清单: 问题答案: 将日期转换为datetime对象,所以现
我有两个日期字段: 开始日期和结束日期和临时日期。 我有一个列表,其中我在开始日期和结束日期之间返回了6条记录。我如何过滤记录并返回最接近临时日期的日期时间? 在示例记录中,我需要获得第二条记录,因为与临时日期相近。实例
我正在使用Hibernate标准API并使用投影获得如下所示的结果: 输出: 这段代码按预期工作,但我想在唯一日期记录的基础上运行distinct函数,这意味着distinct函数不应该考虑时间值,而应该只考虑日期值。所以out put应该是这样的: 知道怎么做吗?