2016-11-28 7 views
2

У меня проблема с преобразованием SQL-запроса из Oracle в Teradata. В Oracle говорится, что:«Первый заказ» в Teradata

SELECT ar.account_no, 
MAX (ah.bal_acct) KEEP (DENSE_RANK FIRST ORDER BY ah.created_t desc) 
FROM ar 
    JOIN ah ON ah.obj_id0 = ar.poid_Id0 
    JOIN acc ON a.poid_id0 = ar.account_obj_Id0 
WHERE acc.account_no = '1234' 
AND ah.created_t <= 1434753495 
GROUP BY ar.account_no 

Мне нужно сделать подобное заявление в Терадате. Я пытался что-то с

QUALIFY ROW_NUMBER() OVER(PARTITION BY max(ah.bal_acct) ORDER BY ah.created_t desc) = 1 

Но все время у меня есть ошибки: Selected, не агрегированные значения должны быть частью соответствующей группы.

Это то, что я получил:

Select ar.account_no, ah.created_t, ah.bal_acct 
FROM VD_REPLICA_BRM.pi_tp_acct_ar_t ar 
    JOIN VD_REPLICA_BRM.pi_tp_acct_ar_hist_T ah ON ah.obj_id0 = ar.poid_Id0 
    JOIN VD_REPLICA_BRM.pi_account_t acc ON acc.poid_id0 = ar.account_obj_Id0 
WHERE acc.account_no = '00003095660515' 
    AND ah.created_t <= CAST('2016-10-31' AS DATE FORMAT 'YYYY-MM-DD') 
QUALIFY ROW_NUMBER() OVER(PARTITION BY max(ah.bal_acct) ORDER BY ah.created_t desc) = 1 
GROUP BY ar.account_no 

Где я ошибаюсь?

+0

'ah.created_t <= date '2016-10-31''. Это обозначение ANSI/ISO для литературных дат –

ответ

2

Я не уверен, что вы можете сделать это с помощью qualify. Эквивалентным заявлением является:

SELECT ar.account_no, ah.created_t, ah.bal_acct 
FROM (SELECT ar.account_no, ah.created_t, ah.bal_acct, 
      ROW_NUMBER() OVER (PARTITION BY ar.account_no ORDER BY ah.created_t DESC) as seqnum 
     FROM ar JOIN 
      ah 
      ON ah.obj_id0 = ar.poid_Id0 JOIN 
      acc 
      ON a.poid_id0 = ar.account_obj_Id0 
     WHERE acc.account_no = '1234' AND ah.created_t <= 1434753495 
    ) t 
WHERE seqnum = 1; 

Duh. Вы можете сделать это с помощью QUALIFY. Вопрос: GROUP BY:

SELECT ar.account_no, ah.created_t, ah.bal_acct 
FROM VD_REPLICA_BRM.pi_tp_acct_ar_t ar JOIN 
    VD_REPLICA_BRM.pi_tp_acct_ar_hist_T ah 
    ON ah.obj_id0 = ar.poid_Id0 JOIN 
    VD_REPLICA_BRM.pi_account_t acc 
    ON acc.poid_id0 = ar.account_obj_Id0 
WHERE acc.account_no = '00003095660515' AND 
     ah.created_t <= CAST('2016-10-31' AS DATE FORMAT 'YYYY-MM-DD') 
QUALIFY ROW_NUMBER() OVER(PARTITION BY ar_account_no ORDER BY ah.created_t desc) = 1 

 Смежные вопросы

  • Нет связанных вопросов^_^