【问题标题】:SQL MAX() omitting valuesSQL MAX() 省略值
【发布时间】:2011-06-10 11:09:56
【问题描述】:

我有一个包含“版本”列的表格 例如,它使用字符串“3.2.2.0”指定软件版本 它也可以有“DEBUG”版本

我想获取列的MAX值,但是省略了DEBUG, 仅当是唯一值时才显示 DEBUG

例子:

Version
-------
3.2.0
3.2.0
DEBUG
3.2.1
3.2.2

MAX(version) 
result obtained -> DEBUG
result desired -> 3.2.2

Version
-------
DEBUG
DEBUG
DEBUG

MAX(version) 
result -> DEBUG  OK!

谢谢!

【问题讨论】:

    标签: sql sql-server-2008 max


    【解决方案1】:

    这只触及桌子一次。 这个很简单...

    ...
    CASE
       WHEN MIN(Version) = 'DEBUG' THEN 'DEBUG'
       ELSE MAX(NULLIF(Version, 'DEBUG'))
    END AS Version
    ...
    

    原创,更新前:

    ...
    MAX(CASE WHEN Version = 'DEBUG' THEN '' ELSE Version END)
    ...
    

    【讨论】:

    • @Bohemian:为什么?证明给我看。编辑:SO 上的 MySQL 和 SQL Server 示例:stackoverflow.com/q/5143460/27535
    • CASE 的优雅使用,但即使在提到的第二种情况下,当 DEBUG 是正确的结果时,它也不会返回 'DEBUG'。
    • @Ray:啊,错过了那一点。会更正。感谢您解释我错过了什么,不像某些人......
    【解决方案2】:
    select max(version)
    from my_table
    where version != 'DEBUG'
    union
    select max(version)
    from my_table
    where not exists (select * from my_table where version != 'DEBUG');
    

    或者如果您使用的是 mysql:

    select ifnull(max(version), 'DEBUG')
    from my_table
    where version != 'DEBUG'
    

    对于 postgres:

    select coalesce(max(version), 'DEBUG')
    from my_table
    where version != 'DEBUG'
    

    【讨论】:

    • 当一个简单的 CASE 就足够时,您是认真地建议在桌面上进行 3 次触摸?
    • 在您的第一个版本中,您将始终有一个值为 null 的行。 Postgres 版本在 SQL Server 中也能正常工作。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2015-07-07
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2022-07-08
    相关资源
    最近更新 更多