sql - 按分组计算具有最大值的行
问题描述
我有一张这样的桌子:
| ID | CATEGORY | PRIORITY |
| --- | -------- | -------- |
| 1 | dogs | 1 |
| 2 | dogs | 2 |
| 3 | cats | 1 |
| 4 | cats | 2 |
| 5 | cats | 2 |
我想要得到的是一个如下所示的分组结果集:
| CATEGORY | HIGHEST_PRIORITY | NMB_ROWS_WITH_HIGHEST_PRIO |
| -------- | ---------------- | -------------------------- |
| dogs | 2 | 1 |
| cats | 2 | 2 |
我想象以下形式的查询可以工作:
SELECT CATEGORY,
MAX(PRIORITY), -- Highest Priority of Category
COUNT(MAX(PRIORITY)) -- Count how many rows within a category have the highest priority
FROM MY_TABLE
GROUP BY CATEGORY;
但无法以COUNT(MAX(PRIORITY))
这种方式计算组内的行数。有没有办法在不使用子查询的情况下实现这一点?
(我使用 Oracle 12c 数据库)
解决方案
窗口函数在这里派上用场。我们可以先对表进行一次迭代,为每个类别生成最高优先级的值。然后,聚合并有条件地计算每个优先级等于最大优先级的次数。
WITH cte AS (
SELECT t.*,
MAX(PRIORITY) OVER (PARTITION BY CATEGORY) MAX_PRIORITY
FROM MY_TABLE t
)
SELECT
CATEGORY,
MAX(PRIORITY) AS HIGHEST_PRIORITY,
COUNT(CASE WHEN PRIORITY = MAX_PRIORITY THEN 1 END) AS NMB_ROWS_WITH_HIGHEST_PRIO
FROM CTE
GROUP BY
CATEGORY;
演示
推荐阅读
- python - 值错误预期 2D 数组改为 1D 数组
- ios - 使用 APN 订阅主题
- java - 如何将所有用户移动到 JDA 中的 VoiceChannel 和 DiscordAPI for Minecraft with Java?
- microsoft-teams - 什么是接受 ms 团队呼叫/键盘快捷键的快捷键?
- reactjs - 在 React 中安装particle.js 时的 NPM ERR
- sql - 在sql中连接两个表,一列到多列
- php - 工作工人的数量少于最大池大小
- linux - NASM GNU/Linux 精灵:无法通过 scanf 读取浮点数
- kubernetes - Prometheus 操作员 AlertmanagerConfig 未知字段“webhook_configs”
- c# - 如何在文本框中添加asp:动态控件值