【问题标题】:find maximum of set of columns for multiple rows in mysql query在mysql查询中查找多行的最大列集
【发布时间】:2011-09-18 20:09:18
【问题描述】:

我有一个包含以下字段和数据的表格。

RefNo Year Month Code
1     2010  7     A
2     2009  10    B
3     2010  8     A
4     2010  5     B

从此我必须找出特定代码的最大值(年、月)。 结果必须是

3   2010  8 A
1   2010  7 B

请帮我解决这个问题。

【问题讨论】:

  • 你想为每个Code做这个吗?

标签: mysql sql groupwise-maximum


【解决方案1】:

我有解决办法:

Select Month(B.NewDate) Mon, Year(B.NewDate) Year, Code, PK
from T1 A ,
(Select Max(Str_To_Date(Concat('01',',',Month,',',Year), '%d,%m,%Y')) as NewDate, Code C
from T1 group by Code) B
Where PK = (Select PK from T1
                where Year = Year(B.NewDate) and Month = Month(B.NewDate)  and Code = A.Code)
and A.Code = C
group by Code

【讨论】:

    【解决方案2】:

    这对你有用吗?这个想法是将年份和月份组合成 SQL 可以获取 MAX 的东西,然后将表加入到这个修改后的版本中。

    SELECT OriginalTable.RefNo, OriginalTable.Year, OriginalTable.Month, OriginalTable.Code
    FROM table OriginalTable,
         (SELECT Code, MAX(Year*100 + Month) AS CombinedDate
          FROM table
          GROUP BY Code) AS MaximumResults
    WHERE OriginalTable.Code = MaximumResults.Code
    AND OriginalTable.Year = MaximumResults.CombinedDate / 100
    AND OriginalTable.Month = MaximumResults.CombinedDate % 100
    

    这里更彻底地解释了这个想法:http://www.techonthenet.com/sql/max.php

    【讨论】:

    • 不错。我想你忘了为CombinedDate添加条件(它也必须参与加入,我明白了)。另外,为什么不使用当前的标准连接语法呢?你的已经过时了,即使它正在工作。我的意思是,你毕竟是在为其他人提供解决方案。
    • 哦,天哪,你是对的——这里有各种各样的问题。无论如何,感谢您的建设性批评;我有点喜欢这个地方!
    【解决方案3】:
    SELECT
      *
    FROM
    (
      SELECT
        ROW_NUMBER() OVER (PARTITION BY Code ORDER BY Year DESC, Month DESC) AS row_number,
        *
      FROM
        myTable
    )
      AS orderedTable
    WHERE
      row_number = 1
    


    编辑现在是在 MySQL 中工作的版本...

    SELECT
      *
    FROM
      myTable
    WHERE
      Year * 12 + Month = (SELECT MAX(Year * 12 + Month) FROM myTable AS lookup WHERE Code = myTable.Code)
    

    EDIT 访问SQL后,可以确认这样更快...

    WHERE
        Year  = (SELECT MAX(Year)  FROM myTable AS lookup WHERE Code = myTable.Code)
    AND Month = (SELECT MAX(Month) FROM myTable AS lookup WHERE Code = myTable.Code AND Year = myTable.Year)
    

    【讨论】:

      【解决方案4】:

      假设你的表名是“table1”

      select * from
      (select * from table1 where Year in (select max(Year) from table1)) abc
      where Month not in (select min(Month) from abc) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2013-04-26
        • 1970-01-01
        • 2018-12-10
        相关资源
        最近更新 更多