按日期划分的MySQL查询逻辑

按日期划分的MySQL查询逻辑,mysql,sql,Mysql,Sql,该地区的餐馆为顾客提供各种各样的食物。只要顾客经常光顾一家餐馆,那家餐馆就会继续供应同一道菜。如果3天以上没有顾客光临某家餐厅,那么该餐厅将在下一位顾客来访时开始供应新的食品。不幸的是,一些成分被污染,导致一些顾客遭受食物中毒。餐馆知道哪些食物受到影响,现在正试图找出哪些顾客受到影响。餐馆保留自己的顾客目录,因此不能保证每个餐馆的顾客都有相同的顾客ID。所有的餐馆都按同样的顺序供应食物。找出哪位顾客吃了哪种食物 样本数据: 餐厅: restaurant_id customer_id visi

该地区的餐馆为顾客提供各种各样的食物。只要顾客经常光顾一家餐馆,那家餐馆就会继续供应同一道菜。如果3天以上没有顾客光临某家餐厅,那么该餐厅将在下一位顾客来访时开始供应新的食品。不幸的是,一些成分被污染,导致一些顾客遭受食物中毒。餐馆知道哪些食物受到影响,现在正试图找出哪些顾客受到影响。餐馆保留自己的顾客目录,因此不能保证每个餐馆的顾客都有相同的顾客ID。所有的餐馆都按同样的顺序供应食物。找出哪位顾客吃了哪种食物

样本数据:

餐厅:

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;