【问题标题】:How to Select Minimum from two rows?如何从两行中选择最小值?
【发布时间】:2013-12-30 03:27:43
【问题描述】:

如何从两行中选择最小值?我试过这个:

SELECT `DATE`, `PRICE1`, `PRICE2`, MIN (`PRICE1`, `PRICE2`) AS MINIMUM_OF_P1P2
FROM `TABLE` 

我想得到这样的结果

DATE        PRICE1  PRICE2  MINIMUM_OF_P1P2
-------------------------------------------
2013-07-08  5.96    5.79    X.XX             <-- 5.79 expected
2013-07-09  5.89    6.04    X.XX             <-- 5.89 expected
2013-07-10  6.03    5.97    X.XX             <-- 5.97 expected
2013-07-11  6.08    6.10    X.XX             <-- 6.08 expected
2013-07-12  6.13    5.97    X.XX             <-- 5.97 expected
2013-07-15  6.15    6.25    X.XX             <-- 6.15 expected
2013-07-16  6.33    6.44    X.XX             <-- 6.33 expected
2013-07-17  6.47    6.35    X.XX             <-- 6.35 expected

但我收到一个错误:FUNCTION MIN 不存在。

【问题讨论】:

    标签: mysql minimum


    【解决方案1】:

    首先,您实际上使用了错误的功能。如果您需要提供的两个值中的最小值,请使用LEAST() 函数。

    MIN() 函数是一个aggregate function。它返回多条记录中的最小值。

    SELECT MIN(`PRICE1`) AS MIN_PRICE1
    FROM `TABLE`
    

    将只返回一条记录:

    MIN_PRICE1
    ----------
    5.89
    

    因为这是您表中PRICE1 的最低值。

    但为什么会出现“FUNCTION MIN 不存在”错误?

    但是,这并不是这里触发错误的原因。问题是函数名和左括号之间有一个空格:

    MIN (`PRICE1`, `PRICE2`)
    

    来自MySQL manual

    注意

    默认情况下,函数名和后面的括号之间不能有空格。这有助于 MySQL 解析器区分函数调用和对碰巧与函数同名的表或列的引用。但是,允许函数参数周围有空格。

    换句话说,MIN( 之间的空格会导致 MySQL 无法正确识别 MIN,并抛出错误消息。

    解决方案:

    只需删除函数名称和左括号(之间的空格即可。

    SELECT `DATE`, `PRICE1`, `PRICE2`, LEAST(`PRICE1`, `PRICE2`) AS MINIMUM_OF_P1P2
    FROM `TABLE`
    

    替代解决方案

    或者,你可以告诉 MySQL 你想在函数名和左括号之间使用一个空格,as described here

    如果您习惯了括号前的空格,并且希望解释器在报告失败之前做一些额外的工作,您可以随时使用 sql 模式通知服务器您的偏好。使用选项--sql-mode=IGNORE_SPACE 启动服务器,或者在运行时更改它:

    set sql_mode='IGNORE_SPACE';
    
    # or if you have the SUPER privilege:
    set global sql_mode='IGNORE_SPACE';
    
    select version(), AES_DECRYPT (AES_ENCRYPT('abc','y'),'y');
    +----------------+------------------------------------------+
    | version()      | AES_DECRYPT (AES_ENCRYPT('abc','y'),'y') |
    +----------------+------------------------------------------+
    | 5.0.17-max-log | abc                                      |
    +----------------+------------------------------------------+
    

    就我个人而言,我会删除空格,这样您的代码就可以在所有环境中运行。

    【讨论】:

    • 我以前从未听说过 LEAST,但 LEAST 是满足我需要的正确功能。感谢您的回复。
    【解决方案2】:

    使用LEAST()

    SELECT `DATE`, 
           `PRICE1`, 
           `PRICE2`, 
            least(`PRICE1`, `PRICE2`) AS MINIMUM_OF_P1P2
    FROM `TABLE` 
    

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2013-04-03
      • 2011-12-14
      • 1970-01-01
      • 2016-11-22
      • 2017-12-07
      • 2021-08-31
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多