查找另一个日期之前的最短日期

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】:

一种选择是为每个表(inquriesresolutions)创建一个子查询,使用日期为每个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 查询)。 我告诉我,我的答案只有在您没有丢失数据的情况下才有效(或者每笔交易都只显示一个查询和解决方案)。

以上是关于查找另一个日期之前的最短日期的主要内容,如果未能解决你的问题,请参考以下文章

查看以获取条件复杂的最短日期

如何获取每个外键的最短日期记录的记录 ID?

获取所有记录,每个月的最短日期,但最新的时间

获取比较当前行和以前行的最小生效日期

SQL 查询以查找给定日期之前的最后一次更改

使用 string[] 在 XmlNode 中查找最新日期