我有一张桌子,其中包含以下尺寸:

mkt_id, dow, dvc, feat, val


val是text类型,包含true / false。
(mkt_id,dow,dvc,feat)组成一个键,而val代表一个值。

为了选择各种键值对,我使用了查询:

SELECT * from <tablename> where mkt_id in (...) and feat = 'xyz'


NEXT:在表中添加了另一个维度,称为ptd

对于相同的键组合(mkt_id,doq,dvc,壮举),由于添加了尺寸val,我得到了多个ptd值。

现在,我的要求是,如果特定键(mkt_id,doq,dvc,feat)的任何值均为true,则必须将其输出为True,否则为false。

我对解决方案的尝试:

SELECT mkt_id, dow, dvc, feat,
CASE WHEN trueCount >= 1 THEN 'true' ELSE 'false' END as val
FROM( SELECT DISTINCT mkt_id,dow,dvc,feat,
SUM( CASE WHEN val='true' THEN 1 ELSE 0 END ) AS trueCount
FROM <tablename> WHERE mkt_id in (...) and feat = 'xyz'


问题在于该查询需要花费大量时间来执行,最终由于database or disk full而导致错误。

非常感谢您对优化查询或解决方案的另一种方法的任何帮助。

最佳答案

要为每个mkt_id / dow / dvc / feat组合获得一个输出行,请在这些列上使用GROUP BY。

比较字符串时,true大于false,因此可以使用MAX()进行选择:

SELECT mkt_id, dow, dvc, feat, MAX(val) AS val
FROM MyTableNameIsTopSecret
WHERE ...
GROUP BY mkt_id, dow, dvc, feat


(可以使用这四个列上的单个索引来优化GROUP BY;在WHERE中使用的列应该在索引中排在第一位。)

10-08 01:33