我有一张包含以下尺寸的表格:
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,feat)的相同组合,由于添加了维度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
而导致错误。
非常感谢任何有关优化查询或解决方案的方法的帮助。
答案 0 :(得分:1)
要为每个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中使用的列应该在索引中排在第一位。)