问题描述
请使用以下SQL代码,我需要将 TTS 表与 CMS 表联接,其中CMS.NEW_COLLECTED_DIGITS = TTS.FULLNUM
,并且我还需要联接TTS.LAST_UDATE_DATE with CMS.Call_Date
,但是挑战是我需要获取TTS.LAST_UDATE_DATE between CMS.Call_Date AND CMS.Call_Date + '01:00:00'::"INTERVAL"
,并且LAST_UDATE_DATE在CMS中有很多记录。Call_Date周期间隔,我只需要获取最大值,
以下查询给了我这个错误: expression_tree_walker:意外的节点类型801
像下面的示例
|FullNum |LAST_UDATE_DATE |Call_Date |
|123456 |6/4/2020 18:10:11 |6/4/2020 18:00:11|
|123456 |6/4/2020 18:13:11 |6/4/2020 18:00:11|
|123456 |6/4/2020 18:14:11 |6/4/2020 18:00:11|
|123456 |6/4/2020 18:20:11 |6/4/2020 18:00:11|
|123456 |6/4/2020 18:30:11 |6/4/2020 18:00:11|
|123456 |6/4/2020 18:40:11 |6/4/2020 18:00:11|
|123456 |6/4/2020 18:50:11 |6/4/2020 18:00:11|
结果将是:
|FullNum |LAST_UDATE_DATE |Call_Date |
|123456 |6/4/2020 18:50:11 |6/4/2020 18:00:11|
代码是
-- Step 1:
-- Get Call Date From IVR with CMS.CALL_HEADER
WITH CMS AS (
SELECT CALL_DATE,New_COLLECTED_DIGITS
FROM CMS),-- Step 2
--Gett All TTS Logs Table
TTS AS (
SELECT ITEM_ID,FullNum,LAST_UDATE_DATE
FROM TTS)
-- Join CMS with TTS while ADSL_Phone_Num is matched and ticket log date is between call date and call date plus one hour
SELECT *
FROM CMS
LEFT JOIN TTS ON
CMS.NEW_COLLECTED_DIGITS = TTS.FULLNUM
AND (FIRST_Value (TTS.LAST_UDATE_DATE) OVER (PARTITION BY TTS.ITEM_ID ORDER BY TTS.LAST_UDATE_DATE DESC )
BETWEEN CMS.Call_Date AND CMS.Call_Date + '01:00:00'::"INTERVAL")
解决方法
嗯。 。 。从描述问题的方式来看,您可以先使用join
然后使用row_number()
为每个cms呼叫记录选择最新记录:
select ct.*
from (select . . .,-- list the columns you want here,row_number() over (partition by cms.new_collect_digits,cms.call_date order by tts.last_update_date desc) as seqnum
from cms left join
tts
on cms.new_collect_digits = tts.fullnum and
tts.last_update_date between cms.call_date and cms.call_date + '01:00:00'::"INTERVAL"
) ct
where seqnum = 1;