【问题标题】:Using GROUP BY and PARTITION BY together同时使用 GROUP BY 和 PARTITION BY
【发布时间】:2022-01-29 09:37:57
【问题描述】:

这是我的第一个查询,它返回下图中的结果

我从“订单”、“客户”和“餐厅”这 3 个表中获得“餐厅名称”、“客户名称”、“订单计数”和“日期”。然后我按餐厅名称、客户名称和日期对其进行分组。

SELECT R.name AS name_of_r, C.name AS name_of_c, COUNT(O.id) AS Orders, date,
FROM orders O
INNER JOIN restaurants R ON R.id = O.restaurant_id AND R.country = O.country 
INNER JOIN customers C ON C.id = O.customer_id AND C.country = O.country
GROUP BY R.name, C.name, date
name_of_r       |   name_of_c    |       Orders       |       date
Howdy           | John Almagro   |          1         |     2021-01-07
Howdy           | John Almagro   |          1         |     2021-07-01
Howdy           | Luke Pablo     |          1         |     2021-01-01
Howdy           | Steven Smith   |          1         |     2021-09-01
JFC             | Monty Tron     |          1         |     2021-01-01
JFC             | Steven Smith   |          1         |     2021-05-04
JFC             | Steven Smith   |          1         |     2021-06-01
KFC             | Luke Pablo     |          1         |     2021-01-09
KFC             | Michael Wren   |          1         |     2021-01-01
KFC             | Monty Tron     |          1         |     2021-04-01
KFC             | Steven Smith   |          1         |     2021-01-01
KFC             | Steven Smith   |          1         |     2021-03-01
KFC             | Steven Smith   |          1         |     2021-08-01
Kitchen Cuisine | Luke Pablo     |          1         |     2021-01-05
Kitchen Cuisine | Luke Pablo     |          1         |     2021-04-01
Kitchen Cuisine | Steven Smith   |          1         |     2021-03-01
Kitchen Cuisine | Steven Smith   |          1         |     2021-06-01
McDonald's      | Arthur Chen    |          1         |     2021-01-01
McDonald's      | Arthur Chen    |          1         |     2021-03-02
McDonald's      | Arthur Chen    |          1         |     2021-05-03
McDonald's      | Arthur Chen    |          1         |     2021-07-01
McDonald's      | Arthur Chen    |          1         |     2021-08-01
McDonald's      | Arthur Chen    |          1         |     2021-09-01

现在,我要做的是按“name_of_r”(RESTAURANT NAME)按“日期”排序,并为每个窗口指定一个行号,这样我就可以获得每个窗口的第三个值。

实际上,这是我的子查询,我想从中获得在每家餐厅下第三单的客户的姓名。

我尝试这样做添加 row_number() 和分区,但它不起作用并给了我一个语法错误

SELECT R.name AS name_of_r, C.name AS name_of_c, COUNT(O.id), date,
ROW_NUMBER() OVER(PARTITION BY R.name ORDER BY date) AS row_num
FROM orders O
INNER JOIN restaurants R ON R.id = O.restaurant_id AND R.country = O.country
INNER JOIN customers C ON C.id = O.customer_id AND C.country = O.country
GROUP BY R.name, C.name, date

我想要的最终输出是在每家餐厅下第三单的顾客的姓名。如下表:

name_of_restaurant       |  name_of_customer_who_placed_the_3rd_order
Howdy                    |      Luke Pablo
JFC                      |      Steven Smith
KFC                      |      Monty Tron
Kitchen Cuisine          |      Steven Smith
McDonald's               |      Arthur Chen

我知道这一点,因为我在我的第一张桌子上订购了日期

【问题讨论】:

  • 请以文字而非图片的形式发布数据。还将所需的输出添加到问题中。
  • 我想获取给每家餐厅下第三单的顾客姓名。
  • 使用您的第一个查询作为 CTE,在外部查询中添加 ROW_NUMBER。
  • 我想添加 row_number,然后使用它来获取每个组的第三个 row_number 的值。也许,我让它变得比 idk 更难。
  • 学习格式化代码,读起来很糟糕……

标签: mysql sql database partition-by


【解决方案1】:

我认为你需要HAVING COUNT

SELECT
    R.name AS name_of_r,
    C.name AS name_of_c,
    COUNT(O.id),
    date
  FROM 
    orders O
  INNER JOIN restaurants R ON R.id = O.restaurant_id AND R.country = O.country
  INNER JOIN customers C   ON C.id = O.customer_id   AND C.country = O.country
  GROUP BY R.name, C.name, date
  HAVING COUNT(O.id) >= 3
;

PS:但它适用于那些在同一天下第三个订单的人。否则,日期必须从分组中排除。

更新: 添加了一个要求在餐厅中选择每三个客户的请求。

SELECT name_of_r, name_of_c, date
  FROM (
    SELECT
        R.name AS name_of_r,
        C.name AS name_of_c,
        date,
        ROW_NUMBER() OVER (PARTITION BY R.name ORDER BY date) AS nc
      FROM 
        orders O
      INNER JOIN restaurants R ON R.id = O.restaurant_id AND R.country = O.country
      INNER JOIN customers C   ON C.id = O.customer_id   AND C.country = O.country
  ) t
  WHERE t.nc = 3
;

ROW_NUMBER Function

【讨论】:

  • 这行得通,只需要给表格一个别名。 Tysm 谢尔盖!
  • Danyal 丹麦语,我忘记了 MySQL.Corrected 中需要别名。将答案标记为解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多