【问题标题】:Find max value in sql table在sql表中查找最大值
【发布时间】:2019-12-17 00:45:41
【问题描述】:

我需要从具有类似“MYNAME-0xxxxx”或“MYNAME-xxxxx”的 varchar 列的表中检索 sql MAX 结果(固定字符串后跟减号,后跟 6 位以零开头的数字或 5 位数字开头非零)

我试过这个:

SELECT MAX(  substring( myColumn  , locate('-', myColumn) ) )  
FROM MyTable

使用此语句,我能够以这种形式“MYNAME-xxxx”实现所有列值的最大数量,但它不适用于“MYNAME-0xxxxx”等列

假设我们有

JOHN-12345
JOHN-12346
JOHN-012347

我希望我的结果是“012347”,但我的代码返回“12346”。在我看来,sql 中 12346 和 012347 之间的 MAX 值是 12346。 请注意,数字是递增的,所以如果我们从 012347 开始,我们可以达到 999999

【问题讨论】:

  • 您使用的是哪个数据库?
  • 对不起:mysql
  • 您说一个固定字符串后跟一个减号,后跟 6 个以零开头的数字或 5 个以非零开头的数字,但您的示例数据只有 3 或 4 个数字.
  • 位数无关紧要,问题仍然存在,但为了澄清,我将编辑我的帖子
  • 正如下面@elserra 提到的,您需要将值转换为整数,这可能会有所帮助:stackoverflow.com/questions/5960620/…

标签: mysql sql


【解决方案1】:

试试这个

select max(id) from(
SELECT namecol REGEXP '[[:digit:]]' as id FROM table) d

【讨论】:

    【解决方案2】:
    SELECT MAX(column_name)
    FROM   table_name
    WHERE  CONDITION;
    

    【讨论】:

      【解决方案3】:

      我还不能发表评论,所以我会在这里给出我的提示:

      我认为问题在于您正在比较字符串。在这种情况下,SQL 查找字母顺序,1 高于 0,因此 string "0999" 低于 string "1"。将其视为单词,单词“b”将排在单词“zaaa”之前。

      将您要比较的字符串转换为数字,然后重试。

      我希望我能解释一下自己。

      【讨论】:

        【解决方案4】:

        虽然其他答案将按原样适用于数据库,但我强烈建议将数据值的字符串部分和数字部分存储在表中的单独字段中。这将允许您为数字部分提供整数类型,因此能够正确找到最大值,而无需担心在运行时解析值。然后,您可以使用以下查询来获取最大值:

        -- id field becomes separate id_name (varchar) and id_num (int) fields
        SELECT CONCAT(id_name, '-', id_num) AS id
        FROM MyTable
        ORDER BY id_num DESC
        LIMIT 1
        

        这在查询优化方面也更好,因为这意味着 id_num 上的索引可以简化排序过程并在需要时节省大量时间。对字符串的一部分进行任何类型的聚合函数(例如 MAX)都需要(非常慢的)表扫描,因为在执行 MAX 函数之前,必须将每个字符串解析为其组成部分。对于数字的索引列表,该列表实际上已经排序,因此查询优化器所要做的就是跳转到列表的末尾以获取 MAX。

        我已经使用上面的 ORDER BY 和 LIMIT 1 实现了它,因为我假设您还希望结果中的 ID 的字符串部分,MAX 不会给您。如果您只需要数字部分并且可以丢弃字符串,则此查询也可以:

        SELECT MAX(id_num) FROM MyTable
        

        【讨论】:

        • 我已经有超过 30k 条记录,我的列是严格按这种形式“STRING-NUMBER”组成的,我不能拆分这个值
        【解决方案5】:

        试试这个

        SELECT val,
               Cast(Substring_index(val, '-', -1) AS UNSIGNED) AS valOrder
        FROM   temp
        ORDER  BY valorder DESC
        LIMIT  1  
        

        或者这个。

        SELECT val
        FROM   temp
        ORDER  BY Cast(Substring_index(val, '-', -1) AS UNSIGNED) DESC
        LIMIT  1;
        

        在线演示:http://www.sqlfiddle.com/#!9/dda898/22/0


        进一步阅读
        - SUBSTRING_INDEX() 函数 - link 01, link 02, link 03
        - 在 MySQL 中未签名和签名 - link 01, link 02

        【讨论】:

        • 这对我来说是正确的,我正在用 HQL 翻译 sql 查询,但我认为这是正确的答案
        【解决方案6】:

        要获取数值列的最大值,请使用 MAX() 函数。

        SELECT MAX(<numeric column>) FROM <table>;
        
        SELECT MAX(<numeric column>) FROM <table> GROUP BY <other column>;
        

        【讨论】:

          猜你喜欢
          • 2014-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-20
          • 1970-01-01
          • 2013-11-16
          • 1970-01-01
          • 2021-12-21
          相关资源
          最近更新 更多