【问题标题】:Use window aggregation functions with joining SQL Netezza在加入 SQL Netezza 时使用窗口聚合函数
【发布时间】:2020-10-25 10:05:36
【问题描述】:

请使用下面的 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 周期间隔中有很多记录,我只需要获取 Max 一个,

下面的查询给了我这个错误:expression_tree_walker: Unexpected node type 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")

【问题讨论】:

    标签: sql join window-functions netezza


    【解决方案1】:

    嗯。 . .从您描述问题的方式来看,您可以使用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;
    

    【讨论】:

    • 它给了我这个错误:发现“ROW_NUMBER”(在字符 1784 处)期待 `')'' 我可以在哪里添加这些括号
    • @AhmedMohammedAbdelKader 。 . .行号在语法上是正确的。您是否按照评论所说的那样将. . . 替换为您想要的列。
    • 是的,我已经添加了其他列的列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多