SQL:从列返回最频繁的值
我有一个名为customerOrders的下表SQL:从列返回最频繁的值,sql,sql-server,Sql,Sql Server,我有一个名为customerOrders的下表 ID user order 1 1 2 2 1 3 3 1 1 4 2 1 5 1 5 6 2 4 7 3 1 8 6 2 9 2 2 10 2 3 我想返回到订单最多的用户。目前,我有以下疑问:
ID user order
1 1 2
2 1 3
3 1 1
4 2 1
5 1 5
6 2 4
7 3 1
8 6 2
9 2 2
10 2 3
我想返回到订单最多的用户。目前,我有以下疑问:
SELECT user, COUNT(user) AS UsersWithMostOrders
FROM customerOrders
GROUP BY user
ORDER BY UsersWithMostOrders DESC;
这将返回按总订单分组的所有值,如
user UsersWithMostOrders
1 4
2 4
3 1
6 1
我只想返回订单最多的用户。在我的例子中,这将是用户1和2,因为它们都有4个订单。如果我使用TOP 1或LIMIT,它将只返回第一个用户。如果我使用TOP 2,它将只在这种情况下工作,当前两个用户的订单数不同时,它将返回无效数据
要求的结果
您可以使用:
看。
结果:
您可以使用:
看。
结果:
选择1
应该适用于大多数版本的SQL
select *
from (
select *,
rank() over(order by numOrders desc) as rrank
from (
select `user`, count(*) as numOrders
from customerOrders
group by `user`
) summed
) ranked
where rrank = 1
玩转代码
选择2
如果您的SQL版本允许使用窗口函数,那么这里有一个更具可读性的解决方案,它可以做同样的事情
with summed as (
select `user`, count(*) as numOrders
from customerOrders
group by `user`
),
ranked as (
select *,
rank() over(order by numOrders desc) as rrank
from summed
)
select *
from ranked
where rrank = 1
使用代码玩转选项1
应该适用于大多数版本的SQL
select *
from (
select *,
rank() over(order by numOrders desc) as rrank
from (
select `user`, count(*) as numOrders
from customerOrders
group by `user`
) summed
) ranked
where rrank = 1
玩转代码
选择2
如果您的SQL版本允许使用窗口函数,那么这里有一个更具可读性的解决方案,它可以做同样的事情
with summed as (
select `user`, count(*) as numOrders
from customerOrders
group by `user`
),
ranked as (
select *,
rank() over(order by numOrders desc) as rrank
from summed
)
select *
from ranked
where rrank = 1
玩转代码您可以使用CTE来达到以下要求:
;WITH CTE AS(
SELECT [user], COUNT(user) AS UsersWithMostOrders
FROM @T
GROUP BY [user])
SELECT M.* from CTE M
INNER JOIN ( SELECT
MAX(UsersWithMostOrders) AS MaximumOrders FROM CTE) S ON
M.UsersWithMostOrders=S.MaximumOrders
您可以使用CTE来达到以下要求:
;WITH CTE AS(
SELECT [user], COUNT(user) AS UsersWithMostOrders
FROM @T
GROUP BY [user])
SELECT M.* from CTE M
INNER JOIN ( SELECT
MAX(UsersWithMostOrders) AS MaximumOrders FROM CTE) S ON
M.UsersWithMostOrders=S.MaximumOrders
下面是Oracle查询的帮助:
WITH test_table AS
(
SELECT user, COUNT(order) AS total_order , DENSE_RANK() OVER (ORDER BY
total_order desc) AS rank_orders FROM customerOrders
GROUP BY user
)
select * from test_table where rank_orders = 1
下面是Oracle查询的帮助:
WITH test_table AS
(
SELECT user, COUNT(order) AS total_order , DENSE_RANK() OVER (ORDER BY
total_order desc) AS rank_orders FROM customerOrders
GROUP BY user
)
select * from test_table where rank_orders = 1
您使用的是哪个版本的SQL?MySQL、PostgreSQL、MSSQL等,并提供SQL版本将是有益的。您使用的是哪个版本的SQL?MySQL、PostgreSQL、MSSQL等,并提供SQL版本将是有益的