我有一张桌子,其中包含以下尺寸:
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中使用的列应该在索引中排在第一位。)