2015-09-04 93 views
1

我有其中载有以下尺寸的表:逻辑或SQLite中

mkt_id, dow, dvc, feat, val 

val为文本类型,包含真/假。 (mkt_id,dow,dvc,feat)形成一个键,val表示一个值。

选择不同的键 - 值对,我使用的查询:

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

NEXT:加入另一个层面托特他叫表ptd

对于键(mkt_id,doq,dvc,feat)的相同组合,由于添加的维数ptd,我得到val的多个值。

现在我的要求是,如果特定键(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

任何帮助优化查询或解决方案的另一种方法是高度赞赏。

回答

1

为了得到一个输出行每个mkt_id/dow/dvc/feat组合,对这些列使用GROUP BY。

当比较字符串,truefalse大,所以可以使用MAX()以选择它:

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

(该GROUP BY可以与这些四列的单指数进行优化;列用在WHERE应该在索引中排在第一位。)

+0

有没有办法避免使用GROUP BY?通过增加查询的成本来分组,如果可能的话,我想避免它。 – user2400394

+0

无论查询如何,它都必须*以某种方式搜索并合并具有匹配的'mkt_id' /'dow' /'dvc' /'feat'值的行。使用GROUP BY,优化至少*可能*。 –