【问题标题】:Finding maximum value from a table从表中找到最大值
【发布时间】:2013-01-07 08:28:24
【问题描述】:

我有一个名为 TestValue 的表,如下所示

value1  value2  value3
10      19      17
78      8       91

我想获得最大值。我在 SQL 中试过这个查询:

select (select MAX(v) from (values (Value1),(Value2),(Value3)) as value(v)) 
      as Maxvalue 
      from TestValue

结果像

Maxvalue
19
91

但我希望结果仅为91

【问题讨论】:

  • 还是甲骨文?还是PostgreSQL?还是 DB2?
  • 我知道这是一个示例,但如果您有 多个 列包含代表相同类型的数据的数据,这通常表明数据建模首先是错误的事情(这样他们之间的比较甚至有意义)

标签: sql max multiple-columns


【解决方案1】:

MS SQL Server 没有GREATEST 函数,但你可以用CASE 语句模拟它:

SELECT MAX(
    CASE
        WHEN value1 > value2 And value1 > value3 THEN value1
        WHEN value2 > value3 THEN value2
        ELSE value3
    END) AS Maxvalue FROM TestValue

【讨论】:

    【解决方案2】:

    greatest 的解决方案很好,但它取决于特定于 db 的解决方案(例如,据我所知,在 SQL Server 上您没有类似 greatest 的东西),因此您可以使用通用解决方案:

    SELECT MAX(v) FROM
    (
      SELECT value1 v FROM tab
      UNION ALL
      SELECT value2 v FROM tab
      UNION ALL
      SELECT value3 v FROM tab
    )
    

    【讨论】:

      【解决方案3】:

      这可行(SQLFiddle):

      SELECT max(greatest(value1, value2, value3))
      FROM testvalue
      

      编辑: 所有流行的服务器(MySQL、PostgreSQL、Oracle)都支持greatest(),但在 MSSQL 上不支持。对于 MSSQL,通常将存储过程创建到 simulate this function

      【讨论】:

        【解决方案4】:

        SQL Fiddle

        MS SQL Server 2012 架构设置

        create table TestValue
        (
          value1 int,
          value2 int,
          value3 int
        );
        
        insert into TestValue values(10,      19,      17);
        insert into TestValue values(78,      8 ,      91);
        

        查询 1

        select max(MaxValue) as MaxValue
        from
        (
          select (select MAX(v) from (values (Value1),(Value2),(Value3)) as value(v)) 
                as Maxvalue 
                from TestValue
        ) as T
        

        Results

        | MAXVALUE |
        ------------
        |       91 |
        

        查询 2

        select max(Value) as MaxValue
        from TestValue 
        unpivot (Value for Col in (Value1, Value2, Value3)) as U
        

        Results

        | MAXVALUE |
        ------------
        |       91 |
        

        【讨论】:

          【解决方案5】:
          select max(max(Value1),max(Value2),max(Value3)) from Persons
          

          测试here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-10-10
            • 1970-01-01
            • 2017-03-25
            • 2015-05-03
            • 2020-12-02
            • 2012-04-25
            • 2011-06-28
            相关资源
            最近更新 更多