Postgres: сохранить результат запроса в переменную и использовать эту переменную в другом запросе

Я использую PostgreSQL 9.6 с запросом, который выглядит примерно так:

DO $$
DECLARE max_sales_date DATE ;
BEGIN

max_sales_date :=

select sales_date::date 
from (
     select count(sales_date::date)
        , sales_date::date
        , row_number() over (order by count(sales_date::date) desc) as rn 
     from Sales
     group by sales_date::date
     ) a where a.rn = 1 ;

select *
from Sales
where sales_date = max_sales_date ;

END $$ ;

Как видите, я хочу получить день с наибольшим количеством продаж, сохранить его в переменной и использовать в другом запросе. Я знаю, что в этом случае переменная не нужна, но мне это нужно для другого шага, разработка которого еще не началась.

DBeaver 5.0, к сожалению, выдает мне следующее сообщение об ошибке:

Внутренняя ошибка драйвера jdbc

java.lang.ArrayIndexOutofBoundsException:

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

Поэтому у меня два вопроса:

  1. Почему не работает весь код?
  2. Как я могу достичь желаемого результата?

РЕДАКТИРОВАТЬ: приведенные ниже комментарии заставили меня понять, что я должен уточнить свои намерения: причина, по которой я хотел бы продолжать использовать переменную, заключается в том, что я планировал впоследствии выполнить некоторые простые вычисления (например, добавить один день, создать цикл и т. д. .). Если вы, ребята, сможете найти простое решение для этого без использования переменной, я тоже буду рад :)


person Guillaume    schedule 20.03.2018    source источник
comment
Можете ли вы добавить трассировку стека в запрос?   -  person Laurenz Albe    schedule 20.03.2018
comment
@LaurenzAlbe Боюсь, я не знаю, что это такое и как я могу это получить.   -  person Guillaume    schedule 20.03.2018
comment
Это длинный список имен методов, который обычно следует за сообщением об ошибке в Java.   -  person Laurenz Albe    schedule 20.03.2018
comment
Чтобы найти более простое решение, вам нужно представить реальную проблему, которую вы пытаетесь решить. Повторное использование максимального значения может быть выполнено с помощью CTE. Но, видимо, это не единственное, что вы хотите сделать.   -  person a_horse_with_no_name    schedule 20.03.2018


Ответы (1)


Вы можете использовать select... в шаблон, и у вас не может быть запроса "select *" в функции DO - он не предназначен для возврата запроса.

DO $$
DECLARE max_sales_date DATE ;
declare sale record;
BEGIN

select sales_date into max_sales_date  from 
(select sales_date from (select count(sales_date) as cnt, sales_date::date 
    from Sales group by sales_date) as dt order by cnt desc limit 1) as ct;

for sale in select * from Sales where sales_date = max_sales_date
loop
-- do whatever is needed with this data
end loop;

END $$ ;
person Dionei Miodutzki    schedule 20.03.2018
comment
ОП сказал: Я знаю, что в этом случае переменная не нужна, но мне это нужно для другого шага, разработка которого еще не началась. - person Laurenz Albe; 20.03.2018
comment
Отредактировал запрос таким образом, чтобы переменная сохранилась. - person Dionei Miodutzki; 20.03.2018
comment
Но это точно так же, как вопрос. Как вы думаете, это не вызовет исключения? Ну, @Guillaume может ответить на это. - person Laurenz Albe; 20.03.2018
comment
Я предполагал, что этот select * будет частью чего-то еще не готового. Когда я тестирую приведенный выше код, возникает ошибка в части select * — вы должны что-то сделать с этим select, так как блок do не может вернуть данные. Изменение кода на полнофункциональный. - person Dionei Miodutzki; 20.03.2018