【发布时间】:2018-01-02 04:26:05
【问题描述】:
我输入的 Teradata 表 accnt_pln_info 样本数据如下。
Account_number Plan_code Plan_Date Base_Amount Biz_Date
ACCT1 R 2017-JAN-01 100 2017-MAY-31
ACCT1 R 2017-JAN-11 30 2017-MAY-31
ACCT1 K 2017-JAN-22 80 2017-MAY-31
ACCT1 B 2017-JAN-13 50 2017-MAY-31
ACCT1 C 2017-JAN-18 180 2017-MAY-31
ACCT2 R 2017-JAN-12 70 2017-MAY-31
ACCT2 C 2017-JAN-02 90 2017-MAY-31
ACCT2 R 2017-JAN-08 10 2017-MAY-31
ACCT2 D 2017-JAN-02 40 2017-MAY-31
ACCT2 B 2017-FEB-24 14 2017-MAY-31
ACCT2 K 2017-FEB-12 79 2017-MAY-31
期望的输出:(对于过滤条件 Biz_Date=2017-MAY-31
Account_number RK_Plan_Date RK_Base_Amount RC_Plan_Date RC_Base_Amount
ACCT1 2017-JAN-22 80 2017-JAN-18 180
ACCT2 2017-FEB-12 79 2017-JAN-12 70
逻辑:
Filter condition applied Biz_Date=2017-MAY-31 as table has multiple distinct biz_dates.
Group by Account_Number; Plan_Date in (R,K),
find the max Plan_Date and then get that rows Base_Amount;
Plan_Date in (R,C), find the max Plan_Date and
then get that rows Base_Amount.
例如: 对于 ACCT1 和 ('R','K') 中的 plan_code,最大 plan_date 值为 2017-JAN-22;因此需要获取该行的 Base_amount 为 80
假设:
There can be duplicates on Account_number and Plan_Code.
There will not be duplicates on Account_number, Plan_Code in (R,K) and Plan_Date.
There will not be duplicates on Account_number, Plan_Code in (R,C) and Plan_Date.
The input order in table is not necessarily the same.
我尝试过但失败了:
SELECT ACCOUNT_NUMBER,
MAX(CASE WHEN PLAN_DATE IN ('R','K') THEN PLAN_DATE END) MAX_RK_PLAN_DATE,
MAX(CASE WHEN PLAN_DATE IN ('R','K') AND MAX_PLAN_DATE=PLAN_DATE THEN BASE_AMOUNT END) REQUIRED_RK_AMOUNT,
MAX(CASE WHEN PLAN_DATE IN ('R','C') THEN PLAN_DATE END) MAX_RC_PLAN_DATE,
MAX(CASE WHEN PLAN_DATE IN ('R','C') AND MAX_PLAN_DATE=PLAN_DATE THEN BASE_AMOUNT END) REQUIRED_RC_AMOUNT
FROM ACCNT_PLN_INFO;
正如预期的那样,它失败了,因为我将聚合函数嵌套到正常的 case 语句中。 我想通过将其拆分为来使用数据块
SELECT ....
(SELECT ACCOUNT_NUMBER, 'RK',
MAX(PLAN_DATE) MAX_RK_PLAN_DATE FROM ACCNT_PLN_INFO WHERE
PLAN_DATE IN ('R','K')
UNION
SELECT ACCOUNT_NUMBER, 'RC',
MAX(PLAN_DATE) MAX_RC_PLAN_DATE FROM ACCNT_PLN_INFO WHERE
PLAN_DATE IN ('R','C') )
并想再次从同一个表中加入外部选择。但是由于(R.K)和(R,C)的不同可能组合,我无法做到这一点。当不涉及任何组合时,我知道如何实现它。
为方便起见,我只指定了 2 个组合,有 2 个值作为 PLAN_DATE IN ('R','K');计划日期('R','C')。但实际上有 6 个组合,每个组合会有 4 个值。
我已经尽我所能来实现这一目标。但不幸的是,做不到。当我们需要多个值的组合和列值的最大值时如何选择列值。感谢您宝贵的时间。
【问题讨论】:
-
存在多少不同的
Account_number以及Biz_Date有多少行符合条件?