假设我有以下数据:
服务器 | 组件 | 状态 |
---|---|---|
A | C1 | 好的 |
A | C2 | 好的 |
B | C1 | 好的 |
B | C2 | 错误 |
我想要一个
SELECT
语句,输出详细记录 和 每个服务器的“小计”,以及 STATUS
列的聚合值(如果至少有一个值是 ERROR
,则它应该阅读ERROR
)。OK
和 ERROR
出现,因此 MIN()
在这里可以工作。
类似这样的:
服务器 | 组件 | 状态 |
---|---|---|
A | C1 | 好的 |
A | C2 | 好的 |
A | 好的 | |
B | C1 | 好的 |
B | C2 | 错误 |
B | 错误 |
我认为这可能可以通过
rollup
或 grouping sets
实现,但我对这些功能很感兴趣;-)
以下 SELECT 可以作为开始。 ;-)
WITH
t
AS
(SELECT 'A' AS server, 'C1' AS component, 'OK' AS status FROM DUAL
UNION ALL
SELECT 'A', 'C2', 'OK' FROM DUAL
UNION ALL
SELECT 'B', 'C1', 'OK' FROM DUAL
UNION ALL
SELECT 'B', 'C2', 'ERROR' FROM DUAL)
SELECT t.*
FROM t;
使用
ROLLUP
:
SELECT server,
component,
MIN(status) AS status
FROM table_name
GROUP BY ROLLUP(server, component)
HAVING GROUPING_ID(server) = 0
ORDER BY server, component
或:
SELECT server,
component,
MIN(status) AS status
FROM table_name
GROUP BY ROLLUP(server, component)
HAVING GROUPING_ID(server, component) < 3
ORDER BY server, component
对于样本数据:
CREATE TABLE table_name (server, component, status) AS
SELECT 'A', 'C1', 'OK' FROM DUAL UNION ALL
SELECT 'A', 'C2', 'OK' FROM DUAL UNION ALL
SELECT 'B', 'C1', 'OK' FROM DUAL UNION ALL
SELECT 'B', 'C2', 'ERROR' FROM DUAL;
两个输出:
服务器 | 组件 | 状态 |
---|---|---|
A | C1 | 好的 |
A | C2 | 好的 |
A | 空 | 好的 |
B | C1 | 好的 |
B | C2 | 错误 |
B | 空 | 错误 |