在加入 SQL Netezza 时使用窗口聚合函数

Posted

技术标签:

【中文标题】在加入 SQL Netezza 时使用窗口聚合函数【英文标题】:Use window aggregation functions with joining 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")

【问题讨论】:

【参考方案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 。 . .行号在语法上是正确的。您是否按照评论所说的那样将. . . 替换为您想要的列。 是的,我已经添加了其他列的列表

以上是关于在加入 SQL Netezza 时使用窗口聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL滑动窗口聚合(不使用窗口函数)

我是 DMBS 系统的新手,是不是可以加入两个数据库系统,如 SQL 和 Netezza?

加入表和过滤并获取聚合函数sql访问

在 netezza 中获取工作日的名称

NZSQL/代码 - Netezza NZ-SQL 中的 LEFT() 函数

查找 SQL 聚合函数调用中的百分比可能没有嵌套聚合或窗口函数