查找另一个日期之前的最短日期
Posted
技术标签:
【中文标题】查找另一个日期之前的最短日期【英文标题】:Finding a minimum date before another date 【发布时间】:2016-05-31 02:08:44 【问题描述】:假设我有两张桌子。一个是包含有关客户服务查询信息的表格,其中包含有关客户的信息和提出查询的时间。客户的信息(在本例中为 ID)会被保存以备将来查询。
CUST_ID INQUIRY_ID INQUIRY_DATE
001 34 2015-05-03 08:15
001 36 2015-05-05 13:12
002 39 2015-05-10 18:43
003 42 2015-05-12 14:58
003 46 2015-05-14 07:27
001 50 2015-05-18 19:06
003 55 2015-05-20 11:40
另一个表包含有关所有客户查询的解决日期的信息。
CUST_ID RESOLVED_DATE
001 2015-05-06 12:54
002 2015-05-11 08:09
003 2015-05-14 19:37
001 2015-05-19 16:12
003 2015-05-22 08:40
除了 CUST_ID 之外,解决表没有链接到查询表的键,因此为了计算解决时间,我想确定每个解决日期在解决之前的最小查询日期。结果表如下所示:
CUST_ID FIRST_INQUIRY RESOLVED_DT
001 2015-05-03 08:15 2015-05-06 12:54
001 2015-05-18 19:06 2015-05-19 16:12
002 2015-05-10 18:43 2015-05-11 08:09
003 2015-05-12 14:58 2015-05-14 19:37
003 2015-05-20 11:40 2015-05-22 08:40
起初我只是选择了 min(INQUIRY_DATE
【问题讨论】:
阻力最小的方法是提供解决方案表的密钥。 同意,但不幸的是我没有那个权力。 我在下面给你回复了。请让我知道这是否满足您的需求。 如果查询没有解决方案怎么办?如果您没有解决日期2015-05-06 12:54
,那么您的预期输出是什么?如果你没有回复日期2015-05-11 08:09
怎么办?
@PhamX.Bach 还有重复项等等。这里有很多陷阱。
【参考方案1】:
一种选择是为每个表(inquries
和resolutions
)创建一个子查询,使用日期为每个CUST_ID
的事务编号。然后,可以使用此有序索引列以及CUST_ID
将两个子查询连接在一起。
我还使用了inquiries
表中的INQUIRY_ID
来打破平局,如果它发生的话。根据您向我们展示的数据,没有办法打破resolutions
表中给定客户和日期的平局。
SELECT t1.CUST_ID, t1.INQUIRY_ID AS FIRST_INQUIRY, t2.RESOLVED_DATE AS RESOLVED_DT
FROM
(
SELECT CUST_ID, INQUIRY_ID, INQUIRY_DATE,
(SELECT COUNT(*) + 1
FROM inquiries
WHERE CUST_ID = t.CUST_ID AND INQUIRY_DATE <= t.INQUIRY_DATE
AND INQUIRY_ID < t.INQUIRY_ID) AS index
FROM inquiries AS t
) AS t1
INNER JOIN
(
SELECT CUST_ID, RESOLVED_DATE,
(SELECT COUNT(*) + 1
FROM resolutions
WHERE CUST_ID = t.CUST_ID AND RESOLVED_DATE < t.RESOLVED_DATE) AS index
FROM resolutions t
) AS t2
ON t1.CUST_ID = t2.CUST_ID AND t1.index = t2.index
子查询表如下所示:
查询:
CUST_ID INQUIRY_ID INQUIRY_DATE index
001 34 2015-05-03 08:15 1
001 36 2015-05-05 13:12 2
002 39 2015-05-10 18:43 1
003 42 2015-05-12 14:58 1
003 46 2015-05-14 07:27 2
001 50 2015-05-18 19:06 3
003 55 2015-05-20 11:40 3
决议:
CUST_ID RESOLVED_DATE index
001 2015-05-06 12:54 1
002 2015-05-11 08:09 1
003 2015-05-14 19:37 1
001 2015-05-19 16:12 2
003 2015-05-22 08:40 2
请注意,此解决方案对缺失数据并不可靠,例如有未结束的查询,或从未记录解决方案。
【讨论】:
感谢您的评论,我会试试看。丢失的数据不是问题,我只关心现有的解决日期。 如果这是评论,那么我无法想象答案的长度:-) 哈,这比评论有点长,这是真的,我很抱歉。我今天真的是第一次看代码,这不是将 5/14 查询链接到客户 003 的 5/22 分辨率吗? (应改为链接 5/20 查询)。 我告诉我,我的答案只有在您没有丢失数据的情况下才有效(或者每笔交易都只显示一个查询和解决方案)。以上是关于查找另一个日期之前的最短日期的主要内容,如果未能解决你的问题,请参考以下文章