我正在拥有23条记录的表,我试图在单个查询中获得记录和最后记录的总数。类似的东西
select count(*) ,(m order by createdDate) from music m ;
有没有什么方法可以将这个记录仅用于PostgreSQL中的最后一次记录和总计数。
答案 0 :(得分:1)
这可以使用窗口函数
来完成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;
根据索引,您的内存配置和表定义可能比两个窗口函数更快。
答案 1 :(得分:0)
不,它不可能做出被要求的事情,sql不会以这种方式运行,第二个你要求计数()sql会将数据级别更改为聚合。做你要求的唯一方法是在一个单独的查询中进行计数()和排序。
答案 2 :(得分:0)
另一种使用窗口函数且没有子查询的解决方案:
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);
这里的要点是last_value适用于由windows定义的分区,而不适用于GROUP BY定义的组。
我没有进行任何测试,但我怀疑我的解决方案在已发布的三个中效果较差。但它到目前为止最接近您的示例查询。