2017-06-07 8 views
0

AAをチェックする前にX、Y、Zがフィルタされるように、このネストされたクエリをどのように減らすことができますか? これは機能しますが、各サブクエリのX、Y、Zを計算するので高価です。 AAのみをチェックインする必要があります。冗長なSQLiteネストされたクエリを減らしますか?

SELECT 3*b3.bin3 + 2*b2.bin2 + b1.bin1 FROM 
    (SELECT count(*) AS bin1 FROM `TD` WHERE 
    `X` = 1 AND 
    `Y` >= 2 AND 
    `Z` >= 2 AND 
    `AA` >= 1 AND `AA` <= 2) b1 
    JOIN 
    (SELECT count(*) AS bin2 FROM `TD` WHERE 
    `X` = 1 AND 
    `Y` >= 2 AND 
    `Z` >= 2 AND 
    `AA` >= 2.01 AND `AA` <= 3) b2 
    JOIN 
    (SELECT count(*) AS bin3 FROM `TD` WHERE 
    `X` = 1 AND 
    `Y` >= 2 AND 
    `Z` >= 2 AND 
    `AA` >= 3.01 AND `AA` <= 4) b3; 

答えて

0

SQL 2008はありますか? asと一緒に使うことができるかもしれません。あなたのデータは2つの小数よりも正確である場合にも、この

With b as 
(
Select 
* 
from TD 
where 
x=1 and 
y >= 2 and 
z >= 2) 

SELECT 3*b3.bin3 + 2*b2.bin2 + b1.bin1 FROM 

(select 
count() 
from b 
where AA >= 1 and AA <= 2) bin1 
join 

(select 
count() 
from b 
where AA >= 2.01 and AA <= 3) bin2 
join 

(select 
count() 
from b 
where AA >= 3.01 and AA <= 4) bin3  
+0

を試してみて、私はあることをBIN2の場所ラインをお勧めかもしれません: をどこAA> 2およびAA <= 3 とのラインbin3は次のようになります。 AA> 3、AA <= 4 –

+0

ありがとう!それが私の必要なヒントでした。私はSQLiteを使用しています。私のデータはほとんど浮動小数点ですが、これは簡単のために示したものです。 – skywalk

0
--REDUCED FORM from Golden Ratio's hint. 
WITH `v` AS 
(SELECT `AA` FROM `TD` WHERE 
    `X` = 1 AND 
    `Y` >= 2 AND 
    `Z` >= 2) 
SELECT 3*bin3 + 2*bin2 + bin1 FROM 
    (SELECT count(*) AS bin1 FROM `v` WHERE 
    `AA` >= 1 AND `AA` <= 2) 
    JOIN 
    (SELECT count(*) AS bin2 FROM `v` WHERE 
    `AA` >= 2.01 AND `AA` <= 3) 
    JOIN 
    (SELECT count(*) AS bin3 FROM `v` WHERE 
    `AA` >= 3.01 AND `AA` <= 4); 
関連する問題