PL SQL SELECT 涉及合计值的案例陈述
PL SQL SELECT Case Statements involving aggregate values
我正在尝试在 Teradata 中编写一个查询,但我不确定该怎么做;我的 table 看起来像这样:
col1: 文本 (account_number)
col2:text(二级账号)
col3: 文本 (Primary_cust)
业务需求是:
"按帐号对记录进行分组。
如果一个帐户只有一个记录,则保留该记录。
如果一个帐号有多个记录,则:
(1) 如果只有一条记录有Primary_CUST = 'Y'则保留。
(2) 如果多个记录有 Primary_CUST = 'Y' 则保留一个最低的 SCDRY_ACCT_NBR
(3) 如果没有记录 Primary_CUST = 'Y' 则保留最低 SCDRY_ACCT_NBR.
我知道我需要一个 CASE 语句并且我能够编写第一个要求,但不确定第二个。任何帮助将不胜感激。
你只需要考虑如何对行进行排序以获得你想要的行,似乎是这样的:
SELECT * FROM tab
QUALIFY
Row_Number()
Over (PARTITION BY account_number -- for each account
ORDER BY Primary_CUST DESC -- 'Y' before 'N' (assuming it's a Y/N column)
,SCDRY_ACCT_NBR -- lowest number
) = 1 -- return the top row
当然 QUALIFY
是专有的 Teradata 语法,如果您需要在 Oracle 上执行此操作,则必须将其包装在 Derived Table:
中
SELECT *
FROM
(
SELECT t.*,
Row_Number()
Over (PARTITION BY account_number -- for each account
ORDER BY Primary_CUST DESC -- 'Y' before 'N' (assuming it's a Y/N column)
,SCDRY_ACCT_NBR) AS rn-- lowest number
FROM tab
) AS dt
WHERE rn = 1 -- return the top row
我正在尝试在 Teradata 中编写一个查询,但我不确定该怎么做;我的 table 看起来像这样:
col1: 文本 (account_number) col2:text(二级账号) col3: 文本 (Primary_cust)
业务需求是: "按帐号对记录进行分组。 如果一个帐户只有一个记录,则保留该记录。 如果一个帐号有多个记录,则: (1) 如果只有一条记录有Primary_CUST = 'Y'则保留。 (2) 如果多个记录有 Primary_CUST = 'Y' 则保留一个最低的 SCDRY_ACCT_NBR (3) 如果没有记录 Primary_CUST = 'Y' 则保留最低 SCDRY_ACCT_NBR.
我知道我需要一个 CASE 语句并且我能够编写第一个要求,但不确定第二个。任何帮助将不胜感激。
你只需要考虑如何对行进行排序以获得你想要的行,似乎是这样的:
SELECT * FROM tab
QUALIFY
Row_Number()
Over (PARTITION BY account_number -- for each account
ORDER BY Primary_CUST DESC -- 'Y' before 'N' (assuming it's a Y/N column)
,SCDRY_ACCT_NBR -- lowest number
) = 1 -- return the top row
当然 QUALIFY
是专有的 Teradata 语法,如果您需要在 Oracle 上执行此操作,则必须将其包装在 Derived Table:
SELECT *
FROM
(
SELECT t.*,
Row_Number()
Over (PARTITION BY account_number -- for each account
ORDER BY Primary_CUST DESC -- 'Y' before 'N' (assuming it's a Y/N column)
,SCDRY_ACCT_NBR) AS rn-- lowest number
FROM tab
) AS dt
WHERE rn = 1 -- return the top row