Postgresql Postgres:将查询结果存储到变量中,并在另一个查询中使用该变量

Postgresql Postgres:将查询结果存储到变量中,并在另一个查询中使用该变量,postgresql,variables,dbeaver,Postgresql,Variables,Dbeaver,我使用的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)

我使用的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.ArrayIndexOutofBoundsAccept:

我还必须提到,其结果存储在变量中的查询在单独使用时工作良好

因此,我有两个问题:

  • 为什么整个代码都不起作用
  • 我怎样才能达到我想要的结果

  • 编辑:下面的评论让我意识到我应该澄清我的意图:我想继续使用变量的原因是因为我计划在之后对它执行一些简单的计算(例如添加一天、创建一个循环等)。如果你们不使用变量就能找到一个简单的解决方案,我也很高兴:)

    你们可以使用select。。。进入模式,并且在DO函数中不能有“select*”查询—它并不意味着返回查询

    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 $$ ;
    

    您能将堆栈跟踪添加到查询中吗?@LaurenzAlbe恐怕我不知道它是什么以及如何获得它。在Java中,错误消息后面通常有一长串方法名。为了找到更简单的解决方案,您需要给出您试图解决的实际问题。可使用CTE重新使用最大值。但显然这并不是你想做的唯一事情。OP说:我知道在这种情况下变量是不必要的,但我需要它来进行另一个尚未开始开发的步骤。编辑查询,以保留变量的方式。但这与问题完全相同。你认为这不会引发异常吗?好吧,@guilloum可以回答。我猜这个“select*”可能是一些还没有准备好的东西的一部分。当我测试上面的代码时,select*部分出现了错误occours——您应该用这个select“做点什么”,因为do块无法返回数据。将代码更改为全功能代码。