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