Sql 如何编写一个分页、排序的查询,该查询还返回组bucket

Sql 如何编写一个分页、排序的查询,该查询还返回组bucket,sql,group-by,bucket-sort,Sql,Group By,Bucket Sort,尝试编写一个查询,该查询返回分页/排序的结果,该结果在bucket中也有分组,如下所示: 0-9999910000-999999100000-9999991000000-4999999950000000+ 每个人都应该有一个startIndex,当他们点击它时可以跳转到哪里 下面是加载此数据的示例查询。用户将在页面底部看到这些组,但它们取决于所排序的列。单击这些组中的一个,然后将用户跳转到该页面和索引。在我的例子中,有更多的列,但我认为分组可以归结为字符串、数字或日期时间。对于字符串,UI希望字

尝试编写一个查询,该查询返回分页/排序的结果,该结果在bucket中也有分组,如下所示:

0-9999910000-999999100000-9999991000000-4999999950000000+

每个人都应该有一个startIndex,当他们点击它时可以跳转到哪里

下面是加载此数据的示例查询。用户将在页面底部看到这些组,但它们取决于所排序的列。单击这些组中的一个,然后将用户跳转到该页面和索引。在我的例子中,有更多的列,但我认为分组可以归结为字符串、数字或日期时间。对于字符串,UI希望字母表中的每个字母都是一个组,但只希望包含数据的字母。对于其他所有内容,应该有大约5或6个桶

有人知道怎么做吗? 这叫什么?在网上找不到任何东西,但我甚至不知道该找什么

declare @startIndex int
declare @pageSize int
declare @Names table
(
    FirstName varchar(100),
    LastName varchar(100),
    Age int,
    NetWorth money
)

select @startIndex = 1
select @pageSize = 10

insert into @Names (FirstName, LastName, Age, NetWorth) values ('John', 'Smith', 24, 304050)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('John', 'Williams', 31, 430901)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Adam', 'Wilson', 29, 121000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Jen', 'Phillips', 75, 1450000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Tommy', 'John', 33, 99000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Alex', 'Smith', 48, 12800000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Dianne', 'Lane', 60, 94000000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Charles', 'Barkley', 46, 21500000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Will', 'Allen', 21, 4000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Michael', 'Jordan', 50, 94500000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Jenny', 'Block', 43, 509000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Oprah', 'Winfrey', 61, 55000000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Charles', 'Smith',50, 3400000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('LeBron', 'James', 29, 74678000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Chris', 'Paul', 30, 19400000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Kobe', 'Bryant', 38, 124600000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Antonio', 'Gates', 36, 17040190)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Tony', 'Romo', 35, 28403400)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Nancy', 'Cammo', 44, 167880)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Bill', 'Brown', 45, 98000)
insert into @Names (FirstName, LastName, Age, NetWorth) values ('Paul', 'Jones', 26, 987900);

WITH SearchResults AS 
(
        SELECT 
            'RowNum' = ROW_NUMBER() over(ORDER BY NetWorth asc)
            ,Age
            ,NetWorth
            ,FirstName
            ,LastName
        FROM @Names
        group by Age, NetWorth, FirstName, LastName
),
counts as (
    select 'TotalRows' = count(*) from @Names
),
maxvalue as (
    select 'Val' = max(NetWorth) from @Names
)
SELECT  sr.RowNum
        ,sr.FirstName
        ,sr.LastName
        ,sr.Age
        ,sr.NetWorth
        ,'TotalRows' = c.TotalRows
        ,'MaxValue' = mv.Val
FROM    SearchResults sr
cross apply counts c
cross apply maxvalue mv
WHERE   sr.RowNum BETWEEN @startIndex AND @pageSize - @startIndex + 1

/*
select  NetWorth,
        count(NetWorth) 
from    @Names
group by NetWorth
order by NetWorth
*/

任何帮助都将不胜感激。

这里有一个尝试,我手边没有sql server(我假设您正在使用),因此您可能需要稍微调整查询:

select * from (
    select ROW_NUMBER() over(ORDER BY NetWorth asc) as rn
         , Age, NetWorth, FirstName, LastName
         , count(*) over () as totalrows
         , max(networth) over () as max_value
    from names
) as t 
where rn between 1 and 10;