我们说我有两张桌子。一个是包含客户服务查询信息的表格,其中包含有关客户和查询时间的信息。保存客户的信息(在这种情况下,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< RESOLVED_DT的情况下),但是对于那些在不同日期有多个查询的客户001和003,查询将返回第一个查询日期,而不是第一个查询日期最后的询问。有谁知道如何做到这一点?我正在使用Netezza。
答案 0 :(得分:0)
一个选项是为每个表(inquries
和resolutions
)创建子查询,该表使用日期为每个CUST_ID
的事务编号。然后,可以使用此有序索引列以及CUST_ID
将这两个子查询连接在一起。
我还使用了INQUIRY_ID
表中的inquiries
来打破平局,如果发生的话。根据您向我们展示的数据,无法在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
请注意,此解决方案对于丢失数据不稳健,例如:有一项调查没有结束,或决议从未被记录。