2016-07-08 3 views
0

私はintとbooleanという2つの列を含むテーブルを持っているとします。私は、ブール列のすべての値がTRUEのint列(しきい値)の最小値を見つける必要があります。このクエリをどのように構築できますか?例えば他の列のすべての値が何らかの条件を満たす最小値を見つけるSQLクエリ

level | detection 
----------------- 
5  | False 
6  | True 
7  | False 
8  | True 
9  | True 
10  | True 

この特定のscenerioため8のレベルを返すべきです。

+1

「SQL Server」には「ブール型」のような型はありません。 'BIT'フィールドを使用していますか?あるいは、これは文字列 'True'と' False'文字列を含む 'VARCHAR'フィールドですか? – Siyual

+0

VARCHAR。それはほとんど問題ではありません。 – Maps

+0

結果として8をどのように期待するか説明できますか?すべてTrueの場合、最小値は6 – StackUser

答えて

3

は、この、

Declare @Table table (level int,detection varchar(25)) 
insert into @Table values 
(5,'False') 
,(6,'True') 
,(7,'False') 
,(8,'True') 
,(9,'True') 
,(10,'True') 

SELECT min(LEVEL) AS Threshold 
FROM @Table 
WHERE LEVEL > (
     SELECT max(LEVEL) 
     FROM @Table 
     WHERE detection = 'False' 
     ) 
1

1つの可能な方法(online demo)のように試してみてください。

WITH T 
    AS (SELECT *, 
       Prev = LEAD([detection]) OVER (ORDER BY [level] DESC), 
       CumeRowCount = SUM(1) OVER (ORDER BY [level] DESC 
              ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
       CumeTrueCount = SUM(CASE WHEN [detection] = 'True' THEN 1 END) OVER 
              (ORDER BY [level] DESC 
              ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
     FROM YourTable) 
SELECT TOP 1 [level] 
FROM T 
WHERE CumeRowCount = CumeTrueCount /*All preceding and current rows must be true*/ 
     AND Prev <> [detection]  /* Next row not true*/ 
ORDER BY [level] DESC 
関連する問題