【发布时间】:2013-11-19 20:45:51
【问题描述】:
我有一个工作查询,它按硬件型号和结果对数据进行分组,但问题是有很多“结果”。我试图将其减少到 “如果结果 = 0 然后保持为 0,否则将其设置为 1”。这通常有效,但我最终有:
day | name | type | case | count
------------+----------------+------+------+-------
2013-11-06 | modelA | 1 | 0 | 972
2013-11-06 | modelA | 1 | 1 | 42
2013-11-06 | modelA | 1 | 1 | 2
2013-11-06 | modelA | 1 | 1 | 11
2013-11-06 | modelB | 1 | 0 | 456
2013-11-06 | modelB | 1 | 1 | 16
2013-11-06 | modelB | 1 | 1 | 8
2013-11-06 | modelB | 3 | 0 | 21518
2013-11-06 | modelB | 3 | 1 | 5
2013-11-06 | modelB | 3 | 1 | 7
2013-11-06 | modelB | 3 | 1 | 563
而不是我试图实现的聚合,每个类型/案例组合只有 1 行。
day | name | type | case | count
------------+----------------+------+------+-------
2013-11-06 | modelA | 1 | 0 | 972
2013-11-06 | modelA | 1 | 1 | 55
2013-11-06 | modelB | 1 | 0 | 456
2013-11-06 | modelB | 1 | 1 | 24
2013-11-06 | modelB | 3 | 0 | 21518
2013-11-06 | modelB | 3 | 1 | 575
这是我的查询:
select CURRENT_DATE-1 AS day, model.name, attempt.type,
CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END,
count(*)
from attempt attempt, prod_hw_id prod_hw_id, model model
where time >= '2013-11-06 00:00:00'
AND time < '2013-11-07 00:00:00'
AND attempt.hard_id = prod_hw_id.hard_id
AND prod_hw_id.model_id = model.model_id
group by model.name, attempt.type, attempt.result
order by model.name, attempt.type, attempt.result;
任何关于我如何实现这一点的提示都很棒。
Day 将始终在WHERE 子句中定义,因此不会发生变化。 name, type, result(case) 和 count 会有所不同。简而言之,对于任何给定的模型,每个 "type + case" 组合我只需要 1 行。正如您在第一个结果集中看到的那样,我有 3 行 modelA 有 type=1 和 case=1(因为有很多 "result" 值我已经变成了 0=0 和其他任何值=1)。我希望将其表示为 1 行,并在示例数据集 2 中聚合计数。
【问题讨论】:
-
哪个行每种类型/案例。定义你的选择。日期和名称可以不同吗?
-
@ErwinBrandstetter,对于 1 个模型(名称),每个类型/结果(案例)组合只有 1 行。有很多型号。
-
每个模型总是至少有 1 行,但由于 succ/fail 和不同的类型,可能会更多。我将在数据集示例中添加更多内容。也许这会更有帮助。我正在尝试按型号、类型、案例进行分组;是的。通常它可以工作,但我只是想在只有计数不同的(否则)唯一行上聚合计数。
标签: sql postgresql group-by case aggregate-functions