代码之家  ›  专栏  ›  技术社区  ›  matthy

sql:尝试选择第二大的元素,但选择了最大的

sql
  •  1
  • matthy  · 技术社区  · 16 年前

    SELECT * 
    FROM bestelling
    WHERE totaalprijs > ALL
    (
        SELECT totaalprijs
        FROM bestelling
        WHERE totaalprijs < ANY
        (
            SELECT totaalprijs
            FROM bestelling
    
        )
    )
    

    表中的元素:

    157.00
    5.00
    82.80
    15.00
    20.00
    20.00
    
    6 回复  |  直到 14 年前
        1
  •  5
  •   Ian Varley    16 年前

    • 从表中的所有行。。。
    • 如果totaalprijs小于某个其他值(即,除表中最大值为157.00的记录外的所有记录),请获取任何值。。。

    SELECT max(totaalprijs)
    FROM 
    (
        SELECT totaalprijs
        FROM bestelling
        WHERE totaalprijs < ANY
        (
            SELECT totaalprijs
            FROM bestelling
        )
    ) M
    

    或者,如果希望所有记录都具有该“第二大”值,则可以使用:

    SELECT * FROM bestelling 
    WHERE totaalprijs = 
    (
        SELECT max(totaalprijs)
        FROM bestelling
        WHERE totaalprijs < ANY
        (
            SELECT totaalprijs
            FROM bestelling
        )
    )
    
        2
  •  5
  •   MJB    16 年前

    select * 
    from bestselling 
    where totaalprijs < (select max(totaalprijs) from bestselling)
    order by totaalprijs desc
    limit 1;
    
        3
  •  1
  •   msarchet    16 年前

    这也是一个很好的解决方案,更明显的是,如果您使用的是MSSQL,那么您选择的第一条记录就符合条件。

    select Top 1 
    from bestselling 
    where totaalprijs < (select max (totaalprijs) from bestselling)
    order by totaalprijs desc
    

    使用

    select * 
    from bestselling 
    where totaalprijs < (select max (totaalprijs) from bestselling)
    order by totaalprijs desc
    limit 1;
    

        4
  •  1
  •   Philip Kelley    16 年前

    中间查询:列出所有值,其中每个值至少存在一个大于该值的值

    外部查询:列出那些值大于中间查询中任何值的所有值

    所以中间查询得到除最大值以外的所有值,而外部查询列出除最大值(即最大值)之外大于所有值的所有值。

    下面的调整后的查询应该可以做到这一点,但是如果有两行或更多行都包含第二大的值,您必须考虑该怎么做。

    SELECT *  
    FROM bestelling 
    WHERE totaalprijs =
     ( 
        SELECT max(totaalprijs)
        FROM bestelling 
        WHERE totaalprijs < ANY 
        ( 
            SELECT totaalprijs 
            FROM bestelling 
    
        ) 
    ) 
    
        5
  •  0
  •   MJB    16 年前

    好吧,那么对于Oracle来说:

    select * 
    from bestselling 
    where totaalprijs < (select max(totaalprijs) from bestselling)
    and rownum < 2
    order by totaalprijs desc;
    
        6
  •  0
  •   Marcus Adams    16 年前

    此解决方案仅使用ALL和ANY来获得结果。

    SELECT totaalprijs
    FROM bestelling
    WHERE totaalprijs < ANY
    (
        SELECT totaalprijs
        FROM bestelling
    
    )
    

    所以,现在我们有一个结果集,其中最大值实际上是第二大值。现在,我们必须从结果集中排除所有较小的元素。因此,我们必须从第一个结果集中选择,而不是再次从bestelling中选择。

    SELECT * 
    FROM
    (
        SELECT totaalprijs
        FROM bestelling
        WHERE totaalprijs < ANY
        (
            SELECT totaalprijs
            FROM bestelling
    
        )
    )
    WHERE totaalprijs >= ALL
    (
        SELECT totaalprijs
        FROM bestelling
        WHERE totaalprijs < ANY
        (
            SELECT totaalprijs
            FROM bestelling
        )
     )