【问题标题】:SQL query to find smallest value above which all values in another column satisfy some conditionSQL查询以找到另一列中的所有值都满足某个条件的最小值
【发布时间】:2016-07-08 21:22:56
【问题描述】:

假设我有一个包含两列的表,一个 int 和一个 boolean。我需要在 int 列(阈值)中找到最小值,在该最小值之上,布尔列中的所有值都是 TRUE。我该如何构造这个查询?

例如:

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

应该为这个特定场景返回 8 级。

【问题讨论】:

  • SQL Server 中没有 boolean 这样的类型。您使用的是BIT 字段吗?或者这是一个 VARCHAR 字段,其中包含文字 TrueFalse 字符串?
  • VARCHAR。这不是这里的问题。
  • 你能解释一下你如何期望 8 作为你的结果。对于所有 True,最小值为 6
  • 第 7 级为假。所以 6 并不是以上所有级别都合格的门槛。 8 是因为它上面的所有级别到最大值 (10) 也是如此。
  • 请试试我的回答。

标签: sql sql-server


【解决方案1】:

这样试试,

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'
        )

【讨论】:

    【解决方案2】:

    一种可能的方式 (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 
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多