查询窗口函数聚合

问题描述 投票:0回答:1

我有一个像这样的查询来分页并获取行数。我可以修改此查询以从总结果而不是当前页面中获取所有可能的 col3 吗?

select col1, col2, col3, count(1) over() as row_count 
from table1
where col2 in ('a','b')
order by col1
offset 0 rows fetch next 5 rows only

我想避免执行另一个查询来获取跨页面的所有可能的 col3 值。显然,数据来自使用连接的多个表。

Name    Course    Country    Row_Count    All_Countries
Jack    CS        USA        20           USA, UK, UAE, India, Canada
John    EE        UK         20           USA, UK, UAE, India, Canada
Will    IT        Canada     20           USA, UK, UAE, India, Canada
Kathy   Law       USA        20           USA, UK, UAE, India, Canada
Kelly   Med       UK         20           USA, UK, UAE, India, Canada

这个想法是每页有 5 行。 首页仅包含美国、英国和加拿大国家。 但对于标准,总共有 20 行,国家是美国、英国、阿联酋、印度和加拿大。

sql sql-server window-functions
1个回答
0
投票

您需要将窗口函数放入子查询中,然后使用

OFFSET
进行过滤。

select col1, col2, col3, row_count
from (
    select *,
      count(*) over() as row_count 
    from table1 t1
    where col2 in ('a','b')
) t1
order by col1
offset 0 rows fetch next 5 rows only;

但是请注意,行集分页速度很慢,并且需要检索所有行才能计算行计数,从而使情况变得更加复杂。使用 Keyset Pagination 会更好,尽管这不允许您计算总行数。

© www.soinside.com 2019 - 2024. All rights reserved.