Oracle. получить максимальное значение из выбранного объявления, а затем сравнить его - PullRequest
0 голосов
/ 31 января 2020

Так что у меня возникли некоторые проблемы с выбором и идеей, как заставить его работать.

       SELECT data1.discount, data7.osp_id, data6.id AS sero_id, data1.estpt_id, data5.festpae_id, MAX(data5.festpae_id) as max_id FROM database1 data1
    JOIN database2 data2 ON data2.id = data1.attr_id
    JOIN database3 data3 ON data3.attr_id = data2.id
    JOIN database4 data4 ON data4.objt_attr_id = data3.id
    JOIN database5 data5 ON data5.stya_id = data4.id
        AND data5.value = 1
    JOIN database6 data6 ON data6.id = data5.sero_id
    JOIN database7 data7 ON data7.id = data6.data7_id
    JOIN database8 data8 ON data8.code = 'CALC1'
WHERE data1.interest_rate = 1 AND data1.ordet_id = data8.id
    AND data1.objt_attr_id = data4.objt_attr_id 

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

ORA-00937: not a single-group group function

Как я понимаю, это происходит из-за параметра MAX().

Вот вывод без MAX():

discount osp_id sero_id estpt_id festpae_id
40       619356 3931831 2144     2000742
50       619356 3931831 2144     2000743
40       619356 3931831 2144     2000737
50       619356 3931831 2144     2000740

Итак, как вы понимаете, мне нужно получить MAX значение festpae_id => 2000743

Идея в конце состоит в том, чтобы получить MAX значение festpae_id и сравнить это с data5.festpae_id, который необходим для получения 1 фактической записи, а не всех.

Таким образом, конечный результат должен быть следующим:

discount osp_id sero_id estpt_id festpae_id
50       619356 3931831 2144     2000743

Этот скрипт используется в таблице представления как LEFT OUTER JOIN, поэтому, если я order это festpae_id, а затем установить rownum = 1, он не будет работать должным образом в таблице вида (но он работает, если запускать отдельно от всей таблицы представления выбора (как левое внешнее соединение)) Вот почему я прошу вашей помощи, как это сделать с MAX(). Или есть способ получше?

1 Ответ

1 голос
/ 31 января 2020

Вообще говоря, не агрегируемые столбцы должны быть частью предложения GROUP BY. Вы присоединились к нескольким таблицам, и я не понял, что и где, но - посмотрите, поможет ли это (обратите внимание на комментарии, которые я написал):

  SELECT MAX (data1.discount),                        --> apply aggregate here
         data7.osp_id,
         data6.id AS sero_id,
         data1.estpt_id,
         -- data5.festpae_id,                         --> remove this
         MAX (data5.festpae_id) AS max_id
    FROM database1 data1
         JOIN database2 data2 ON data2.id = data1.attr_id
         JOIN database3 data3 ON data3.attr_id = data2.id
         JOIN database4 data4 ON data4.objt_attr_id = data3.id
         JOIN database5 data5
            ON     data5.stya_id = data4.id
               AND data5.VALUE = 1
         JOIN database6 data6 ON data6.id = data5.sero_id
         JOIN database7 data7 ON data7.id = data6.data7_id
         JOIN database8 data8 ON data8.code = 'CALC1'
   WHERE     data1.interest_rate = 1
         AND data1.ordet_id = data8.id
         AND data1.objt_attr_id = data4.objt_attr_id
GROUP BY data7.osp_id, data6.id, data1.estpt_id       --> add all non-aggregated columns here

[РЕДАКТИРОВАТЬ]

С примерами данных, которые вы разместили, и запросом, который я предложил применить, к нему, результат, кажется, будет в порядке:

SQL> with test (discount, osp_id, sero_id, estpt_id, festpae_id) as
  2  (
  3  select 40,       619356, 3931831, 2144,     2000742 from dual union all
  4  select 50,       619356, 3931831, 2144,     2000743 from dual union all
  5  select 40,       619356, 3931831, 2144,     2000737 from dual union all
  6  select 50,       619356, 3931831, 2144,     2000740 from dual
  7  )
  8  select max(discount) discount,
  9         osp_id,
 10         sero_id,
 11         estpt_id,
 12         max(festpae_id) festpae_id
 13  from test
 14  group by osp_id,
 15           sero_id,
 16           estpt_id;

  DISCOUNT     OSP_ID    SERO_ID   ESTPT_ID FESTPAE_ID
---------- ---------- ---------- ---------- ----------
        50     619356    3931831       2144    2000743

SQL>

Как видите, только одна строка возвращается с FESTPAE_ID = 2000743 (последний, как вы хотели). Если вы получили другой результат, должно быть что-то еще. Что бы это было, я не могу сказать - очевидно, запрос работает нормально (с моей точки зрения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...