2015-09-04 70 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,優化至少*可能*。 –