sql - 如何在按计数排序的sql表中获取10个中级用户

标签 sql sql-server sql-server-2008

我有两个具有以下架构的表:

表A

usernName, email (one email per user)

表B

userName, product (many products per user)

我想编写一个返回 userName + email 的查询产品数量最多的 10 个用户中,中间有 10 个用户,产品数量最少的 10 个用户。

我提前验证有超过30条记录(以避免重复)

我知道groupby不会帮助我。我应该使用 partitionby 的排名吗? ? groupby 和有什么不一样?和partitionby

这个应该怎么写?

最佳答案

SELECT  userName, email
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (ORDER BY products DESC) rn,
                COUNT(*) OVER () AS cnt
        FROM    (
                SELECT  userName, email, products
                FROM    a
                CROSS APPLY
                        (
                        SELECT  COUNT(*) products        
                        FROM    b
                        WHERE   b.userName = a.userName
                        ) p
                )
        ) q
WHERE   rn <= 10
        OR
        rn >= cnt - 10
        OR
        rn BETWEEN cnt / 2 - 5 AND cnt / 2 + 4

关于sql - 如何在按计数排序的sql表中获取10个中级用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10671558/

相关文章:

sql-server-2008 - SELECT COUNT(*) > 进入变量 T-SQL

mysql - 基于动态日期的不同用户计数

sql - 查询以显示每个卖家的最大销售额

sql-server - 缺少 : Utility Explorer in Management Studio 2008 R2

sql-server - 优化 Azure SQL Server 中最新/最后一行的表

asp.net - 错误。 SQL 网络接口(interface),错误 : 26 - Error Locating Server/Instance Specified

sql-server - 当我使用 Entity Framework 将 bool 映射到 SQL Server 时,如何定义 SQL Server 数据类型?

sql - 如何返回由经度和纬度值提供的 Xkm 半径内的 PostgreSQL/PostGIS 表中的所有行?

java - 查询没有返回结果

sql-server - 使用 FOR JSON AUTO 语法时删除空的 json 对象