SQL查询:联接表中最频繁的值

SQL查询:联接表中最频繁的值,sql,sql-server,Sql,Sql Server,我正在处理一个SQL查询,其中我希望根据另一个字段的最频繁出现来连接一个字段的最频繁出现的两个表 这里有一张餐馆的桌子,上面有我最想经常点餐的餐馆。 这些物品可以由同一家餐厅的多个不同的人订购。我想得到每家餐厅最常吃的食物的结果,其中我想知道最常吃的人是谁 Table Restaurants Restaurant ======= R1 R2 Table Orders Item RequestedBy Restaurant Date ==================

我正在处理一个SQL查询,其中我希望根据另一个字段的最频繁出现来连接一个字段的最频繁出现的两个表

这里有一张餐馆的桌子,上面有我最想经常点餐的餐馆。 这些物品可以由同一家餐厅的多个不同的人订购。我想得到每家餐厅最常吃的食物的结果,其中我想知道最常吃的人是谁

Table Restaurants  
Restaurant
=======
R1
R2 

Table Orders
Item    RequestedBy    Restaurant     Date
==========================================
B1          A           R1             123
B1          B           R1             234
B2          C           R2             456
B1          A           R1             567
我想要什么

Restaurant  Item   RequestedBy
============================
 R1          B1        A
 R2          B2        C
我目前拥有以下脚本:

SELECT Restaurants.Restaurant, Orders.Item, Orders.RequestedBy
FROM Restaurants 

LEFT JOIN (Select Restaurant, Item, RequestedBy
From [Orders] T1
Where Item=  
(Select TOP 1 Item
    from [Orders] T2
    where T1. Restaurant = T2. Restaurant
    group by Item
    order by count(Item) desc
)
group by Restaurant, Item, RequestedBy) Orders

ON  Restaurants.Restaurant = Orders.Restaurant  
当前返回的数据如下:

 Restaurant  Item   RequestedBy
 ===========================
 R1           B1        A
 R1           B1        B
 R2           B2        C

任何帮助都将不胜感激!感谢假设给定的Orders表中有一些不合适的数据,那么请求将按照描述查找

“获取每家餐厅最常吃的食物的结果” 第二步是

“我想要最常请求的人”

我建议保持简单,并在视图中拆分任务,例如

Create View V_OrdersPerRestaurant_Item as
Select Restaurant,Item, COUNT(*) as Orders
from [dbo].[orders]
group by Restaurant,Item


Create View V_MaxSelectItemPerRestaurant as
Select * from V_OrdersPerRestaurant_Item ov
where Orders = (Select Max(Orders) from V_OrdersPerRestaurant_Item where  ov.Restaurant=Restaurant)


Create View V_MaxSelectItemPerRestaurantAndRequestedBy as
Select ms.Item,ms.Restaurant,o.RequestedBy,Count(*) as Requests from V_MaxSelectItemPerRestaurant ms
join [dbo].[orders] o on ms.Item=o.Item and ms.Restaurant=o.Restaurant
group by ms.Item,ms.Restaurant,o.RequestedBy
应允许通过以下方式获得预期结果:

Select * from  V_MaxSelectItemPerRestaurantAndRequestedBy ov
where Requests=(Select max(Requests) from V_MaxSelectItemPerRestaurantAndRequestedBy iv where iv.Item=ov.Item and ov.Restaurant=iv.Restaurant)

我认为最简单的方法是使用
apply

select r.restaurant, ri.item, rir.requestedby
from restaurant r cross apply
     (select top (1) o.item, count(*) as cnt
      from orders o
      where o.restaurant = r.restaurant
      order by count(*) desc
     ) ri cross apply
     (select top (1) o2.requrestedby, count(*) as cnt
      from orders o2
      where o2.restaurant = r.restaurant and
            o2.item = r.item
      order by count(*) desc
     ) rir;
另一种有效的方法是带有窗口功能的order by:

select top (1) with ties restaurant, item, requestedby
from (select o.restaurant, o.item, o.requestedby,
             count(*) as rir_cnt,
             sum(count(*)) over (partition by o.restaurant, o.item) as ri_cnt
      from orders o
      group by o.restaurant, o.item, o.requestedby
     ) rir
order by row_number() over (partition by restaurant order by ri_cnt desc),
         row_number() over (partition by restaurant, item order by rir_cnt desc);

我无法理解,如果只为R2提供了
B2 C R2 456
,您希望如何获得
R2 B1 B
。您是否真的需要加入
餐厅
表?似乎您可以仅从
订单
表中获得所需的所有信息。@bummi oops对此表示抱歉。编辑问题以解决此问题!