如何获取最频繁的值SQL

M.N*_*aro 1 sql oracle oracle11g

我有一个表 Orders(id_trip, id_order)、表 Trip(id_hotel, id_bus, id_type_of_trip) 和表 Hotel(id_hotel, name)。

我想在订单表中获得最常出现的酒店的名称。

SELECT hotel.name from Orders
 JOIN Trip
 on Orders.id_trip = Trip.id_hotel
 JOIN hotel
 on trip.id_hotel = hotel.id_hotel
  FROM (SELECT hotel.name, rank() over (order by cnt desc) rnk
          FROM (SELECT hotel.name, count(*) cnt
                  FROM Orders
                 GROUP BY hotel.name))
 WHERE rnk = 1;
Run Code Online (Sandbox Code Playgroud)

mat*_*guy 6

分布中“最常出现的值”是统计学中的一个独特概念,具有技术名称。它被称为分布的模式。而 Oracle 有STATS_MODE()它的功能。https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions154.htm

例如,使用EMP标准SCOTT模式中的表,select stats_mode(deptno) from scott.emp将返回30- 拥有最多员工的部门的编号。(30 是部门“名称”或编号,不是该部门的员工人数!)

在你的情况下:

select stats_mode(h.name) from (the rest of your query)
Run Code Online (Sandbox Code Playgroud)

注意:如果两个或多个酒店被绑定为“最频繁”,STATS_MODE()则将返回其中之一(非确定性)。如果您需要所有绑定值,您将需要一个不同的解决方案 - 一个很好的例子在文档中(上面链接)。这是 Oracle 对统计概念的理解和实现中的一个记录缺陷。