按日期划分的MySQL查询逻辑
该地区的餐馆为顾客提供各种各样的食物。只要顾客经常光顾一家餐馆,那家餐馆就会继续供应同一道菜。如果3天以上没有顾客光临某家餐厅,那么该餐厅将在下一位顾客来访时开始供应新的食品。不幸的是,一些成分被污染,导致一些顾客遭受食物中毒。餐馆知道哪些食物受到影响,现在正试图找出哪些顾客受到影响。餐馆保留自己的顾客目录,因此不能保证每个餐馆的顾客都有相同的顾客ID。所有的餐馆都按同样的顺序供应食物。找出哪位顾客吃了哪种食物 样本数据: 餐厅:按日期划分的MySQL查询逻辑,mysql,sql,Mysql,Sql,该地区的餐馆为顾客提供各种各样的食物。只要顾客经常光顾一家餐馆,那家餐馆就会继续供应同一道菜。如果3天以上没有顾客光临某家餐厅,那么该餐厅将在下一位顾客来访时开始供应新的食品。不幸的是,一些成分被污染,导致一些顾客遭受食物中毒。餐馆知道哪些食物受到影响,现在正试图找出哪些顾客受到影响。餐馆保留自己的顾客目录,因此不能保证每个餐馆的顾客都有相同的顾客ID。所有的餐馆都按同样的顺序供应食物。找出哪位顾客吃了哪种食物 样本数据: 餐厅: restaurant_id customer_id visi
restaurant_id customer_id visit_date
1 1 2020-01-01
2 1 2020-01-01
1 2 2020-01-03
3 1 2020-01-04
2 2 2020-01-14
3 1 2020-01-11
2 3 2020-01-14
食物:
期望的:
Restaurant Customer Visit Food
1 1 2020-01-01 Spaghetti
2 1 2020-01-01 Spaghetti
1 2 2020-01-03 Spaghetti
3 1 2020-01-04 Spaghetti
2 2 2020-01-10 Chicken and Rice
3 1 2020-01-11 Chicken and Rice
2 3 2020-01-14 Tacos
步骤1:按日期顺序添加要处理的行号,并添加一列food_factor,不同食品的值为1,相同食品的值为0 步骤2:为行=1指定1(因为客户访问的第一天提供的食物id为1) 步骤3:按照每个餐厅的参观日期顺序查找id的累计总和 步骤4:在food_id上左键连接food table以获得foodname
SELECT restaurant_id,
customer_id,
visit_date,
f.food_name
FROM (
SELECT restaurant_id,
customer_id,
visit_date,
Sum(food_factor) OVER (partition BY restaurant_id ORDER BY row) AS foodid
FROM (
SELECT restaurant_id,
customer_id,
visit_date,
row,
CASE
WHEN row=1 THEN 1
ELSE food_factor
END AS food_factor
FROM (
SELECT restaurant_id,
customer_id,
visit_date,
Row_number() OVER( partition BY restaurant_id ORDER BY visit_date) AS row
case
WHEN datediff(day,visit_date , lag(visit_date)over(partition by restaurant_id ORDER BY visit_date) >3 THEN 1
ELSE 0
END AS food_factor FROM restaurant
) restaurant_food
) final
) a
LEFT OUTER JOIN food f
ON a.foodid=f.food_id
要求家庭作业帮助的问题必须包括到目前为止你为解决问题所做工作的总结,以及对你解决问题的困难的描述。请阅读您的帖子。您是否尝试根据3天的逻辑在餐厅桌子上创建中间列?
SELECT restaurant_id,
customer_id,
visit_date,
f.food_name
FROM (
SELECT restaurant_id,
customer_id,
visit_date,
Sum(food_factor) OVER (partition BY restaurant_id ORDER BY row) AS foodid
FROM (
SELECT restaurant_id,
customer_id,
visit_date,
row,
CASE
WHEN row=1 THEN 1
ELSE food_factor
END AS food_factor
FROM (
SELECT restaurant_id,
customer_id,
visit_date,
Row_number() OVER( partition BY restaurant_id ORDER BY visit_date) AS row
case
WHEN datediff(day,visit_date , lag(visit_date)over(partition by restaurant_id ORDER BY visit_date) >3 THEN 1
ELSE 0
END AS food_factor FROM restaurant
) restaurant_food
) final
) a
LEFT OUTER JOIN food f
ON a.foodid=f.food_id
SELECT
restaurant_id,
customer_id,
visit_date,
f.food_name
FROM
(SELECT
restaurant_id,
customer_id,
visit_date,
sum(food_factor) over (partition by restaurant_id order by row1) as 'foodid'
FROM
(SELECT
restaurant_id,
customer_id,
visit_date,
row1,
case when row1=1 then 1 else food_factor end as food_factor from
(SELECT
restaurant_id,
customer_id,
visit_date,
row_number()
over( partition by restaurant_id order by visit_date) as 'row1',
case
when DATEDIFF(visit_date , lag(visit_date)over(partition by restaurant_id order by visit_date)) >3 then 1 else 0 end as food_factor
FROM
restaurant)restaurent_food)final)a
LEFT JOIN food f on a.foodid=f.food_id;