Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:从列返回最频繁的值_Sql_Sql Server - Fatal编程技术网

SQL:从列返回最频繁的值

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 我想返回到订单最多的用户。目前,我有以下疑问:

我有一个名为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 
我想返回到订单最多的用户。目前,我有以下疑问:

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版本将是有益的