【问题标题】:Aggregate and count conditionally but return all lines有条件地聚合和计数但返回所有行
【发布时间】:2022-12-03 13:55:04
【问题描述】:

我的表结构是这样的:

+----------+------------+---------------+
| id       | manager_id | restaurant_id |
+----------+------------+---------------+
| 1        | 1          | 1001          |
| 2        | 1          | 1002          | 
| 3        | 2          | 1003          |
| 4        | 2          | 1004          |
| 5        | 2          | 1005          |
| 6        | 3          | 1006          |
+----------+------------+---------------+

我想检索每个 manager_id 聚合的所有 restaurant_id,此外,我还需要过滤每个经理的 count(restaurant_id):仅返回拥有超过 1 家餐厅且少于 3 家餐厅的经理的餐厅。

所以最后,结果将是

+---------------+------------+
| restaurant_id | manager_id | 
+---------------+------------+
| 1001          | 1          |
| 1002          | 1          |
+---------------+------------+

我尝试了类似的东西:

SELECT 
  restaurant_id, 
  manager_id,
  COUNT(*) AS restaurant_count
FROM 
  Manager_Restaurant
GROUP BY 
  manager_id
HAVING 
  restaurant_count > 1 and 
  restaurant_count < 3;

但是由于分组,每个经理只返回一行,我想要所有的餐馆。

【问题讨论】:

  • 写 > 1 和 < 3 而不是 = 2 的目的是什么?计数总是产生整数值。此外,您的计数选择在这种情况下没有意义,您也可以只写 SELECT...,2。你确定你的描述是正确的吗?
  • 谢谢乔纳斯。这是更复杂数据的简化版本。在实际用例中,我实际上需要1 &gt; restaurant_count &gt; 5。只是想让示例保持简单,但这令人困惑。

标签: sql count grouping aggregation


【解决方案1】:

您可以在此处使用窗口计数。大于 1 小于 3 为 2:

select restaurant_id, manager_id
from (
  select *, Count(*) over(partition by manager_id) cnt
  from t
)t
where cnt = 2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2023-03-05
    • 2023-03-23
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多