我们可以从postgresql获取totalcount和最后一条记录吗

我们可以从postgresql获取totalcount和最后一条记录吗,sql,postgresql,Sql,Postgresql,我的表有23条记录,我试图在单个查询中获得记录总数和最后一条记录。诸如此类 select count(*) ,(m order by createdDate) from music m ; 有没有办法在PostgreSQL中只提取最后一条记录以及总计数。不,不可能执行所要求的操作,sql不会以这种方式运行,当您要求计数时()sql会将数据级别更改为聚合。执行您要求的操作的唯一方法是在单独的查询中执行count()和order by。这可以使用窗口函数完成 select * from (

我的表有23条记录,我试图在单个查询中获得记录总数和最后一条记录。诸如此类

select count(*) ,(m order by createdDate)  from music m ;

有没有办法在PostgreSQL中只提取最后一条记录以及总计数。

不,不可能执行所要求的操作,sql不会以这种方式运行,当您要求计数时()sql会将数据级别更改为聚合。执行您要求的操作的唯一方法是在单独的查询中执行count()和order by。

这可以使用窗口函数完成

select *
from (
   select m.*, 
          row_number() over (order by createddate desc) as rn,
          count(*) over () as total_count
   from music
) t
where rn = 1;
另一种选择是使用标量子查询并将其与
limit
子句组合:

select *, 
       (select count(*) from order_test.orders) as total_count
from music
order by createddate desc
limit 1;

根据索引的不同,内存配置和表定义可能比两个窗口函数更快

另一种使用窗口功能且无子查询的解决方案:

SELECT DISTINCT count(*) OVER w, last_value(m) OVER w
FROM music m
WINDOW w AS (ORDER BY date DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);
这里的要点是,最后一个_值适用于windows定义的分区,而不是GROUP by定义的组


我没有执行任何测试,但我怀疑我的解决方案在已经发布的三个解决方案中效果较差。但它也是迄今为止最接近您的示例查询。

这是可能的。是的,我知道这可以在使用窗口功能的嵌套查询中完成,但根据问题,我认为用户希望对大型数据集使用单行类型的查询,也是计算查询,嵌套查询的执行速度会比两个单独的查询慢。您如何知道单个查询的执行速度会慢?你测试过了吗?这两个窗口函数都可以由数据库在一个查询中进行评估——通常是Postgres中的Seq扫描。在两次查询中,您将得到两次Seq扫描,这是工作的两倍。是的,对其进行了评估。您的查询vs两个查询-query 1 count(),query 2选择order By后的top 1这是一个包含23行的表,OP从未说过性能或查询长度有任何问题。。。我不认为故意回答不真实的问题是一个好主意,因为你认为OP想问一些与他实际问的不同的问题^^