我有两个具有以下架构的表:
表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/