Совокупный SQL-запрос не работает, если оператор select содержит столбцы типа DATE - PullRequest
0 голосов
/ 04 марта 2019

Я хочу выбрать одну запись с последним значением в столбце версии.Однако, если я включаю столбец retrn_period, который имеет тип даты, мой запрос возвращает несколько записей.

SELECT rdo_code, batch_no, reference_no, dln, retrn_seq_num, ftype_code, tin, 
    branch_code, tax_type, retrn_period, Max(version)
FROM   rfp_returns_ref 
WHERE  tin = '000079108' 
AND    ftype_code = '1702EX' 
AND    Upper(status) = Upper('POSTED') 
group by rdo_code, batch_no,reference_no, dln, 
    retrn_seq_num, ftype_code, tin, branch_code, tax_type, retrn_period;

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Если вы хотите выбрать отдельную запись - с наибольшим номером версии - тогда я не думаю, что вам вообще нужно что-либо группировать.

Упорядочение строк по номеру версии и захват верхней части1 должен сделать это:

SELECT
    rdo_code,
    batch_no,
    reference_no,
    dln,
    retrn_seq_num,
    ftype_code,
    tin,
    branch_code,
    tax_type
    retrn_period,
    version
FROM rfp_returns_ref 
WHERE
    tin = '000079108' 
    AND ftype_code = '1702EX' 
    AND UPPER(status) = UPPER('POSTED')
ORDER BY version DESC
FETCH FIRST 1 ROWS ONLY;

Этот запрос предполагает, что вы используете Oracle 12c.

0 голосов
/ 04 марта 2019
You can also use rownum=1

SELECT
    rdo_code,
    batch_no,
    reference_no,
    dln,
    retrn_seq_num,
    ftype_code,
    tin,
    branch_code,
    tax_type
    retrn_period,
    version
FROM rfp_returns_ref 
WHERE
    tin = '000079108' 
    AND ftype_code = '1702EX' 
    AND UPPER(status) = UPPER('POSTED')
AND rownum=1
ORDER BY version DESC;
---------------------------------------------------------------------------------------
or subquery like

SELECT
    rdo_code,
    batch_no,
    reference_no,
    dln,
    retrn_seq_num,
    ftype_code,
    tin,
    branch_code,
    tax_type
    retrn_period,
    version
FROM rfp_returns_ref a
WHERE
    tin = '000079108' 
    AND ftype_code = '1702EX' 
    AND UPPER(status) = UPPER('POSTED')
AND a.version = (SELECT Max(b.version) 
                   FROM rfp_returns_ref b 
                  WHERE b.tin = a.tin
                    AND b.ftype_code = a.ftype_code
                    AND b.UPPER(status) = UPPER(a.status));
0 голосов
/ 04 марта 2019

Если я включу столбец retrn_period ... мой запрос возвращает несколько записей.

Включая столбец retrn_period, вы меняете неагрегированную проекцию запроса, поэтомутеперь вы получаете максимальную версию для каждой отдельной даты в наборе результатов.

Вы хотите показать дату последней версии?Если предположить, что ваше retrn_period увеличится вместе с version, это будет работать:

SELECT rdo_code, batch_no, reference_no, dln, retrn_seq_num, ftype_code, tin, 
    branch_code, tax_type
       , max(retrn_period) as retrn_period
       , max(version) as version
FROM   rfp_returns_ref 
WHERE  tin = '000079108' 
AND    ftype_code = '1702EX' 
AND    Upper(status) = Upper('POSTED') 
group by rdo_code, batch_no,reference_no, dln, 
    retrn_seq_num, ftype_code, tin, branch_code, tax_type;

Более общее решение, которое будет работать для чего-то, что не может быть агрегировано, скажем, name, будет заключаться в использованииподзапрос с аналитической функцией ...

SELECT sq.rdo_code, sq.batch_no, sq.reference_no, sq.dln, sq.retrn_seq_num, sq.ftype_code, sq.tin, 
    sq.branch_code, sq.tax_type
       , sq.retrn_period
       , sq.name
       , sq.version
from (    
    SELECT rdo_code, batch_no, reference_no, dln, retrn_seq_num, ftype_code, tin, 
            branch_code, tax_type
               , retrn_period
               , version
               , name
               , rank() over (partition by rdo_code, batch_no,reference_no, dln, 
            retrn_seq_num, ftype_code, tin, branch_code, tax_type
                    order by version desc ) as rn
        FROM   rfp_returns_ref 
        WHERE  tin = '000079108' 
        AND    ftype_code = '1702EX' 
        AND    Upper(status) = Upper('POSTED') 
        ) sq
where sq.rn = 1 ;

Если вы используете Oracle 12c, вы можете использовать синтаксис ограничения выборки, который намного проще:

SELECT rdo_code, batch_no, reference_no, dln, retrn_seq_num, ftype_code, tin, 
    branch_code, tax_type
       , retrn_period
       , version
FROM   rfp_returns_ref 
WHERE  tin = '000079108' 
AND    ftype_code = '1702EX' 
AND   order by version desc 
fetch first 1 row only;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...