【问题标题】:How to Select row with maximum date [duplicate]如何选择具有最大日期的行[重复]
【发布时间】:2016-12-22 17:56:36
【问题描述】:

这是我的表名 tblPE

PEID |idnum  | PE_DATE_EXAM   | ATTENDANCE       
1    | 39    | 2014-08-01     | PRESENT       
2    | 42    | 2014-08-10     | ABSENT            
3    | 39    | 2014-08-12     | PRESENT           
4    | 43    | 2014-08-05     | PRESENT        
5    | 42    | 2014-07-15     | NULL           
6    | 39    | 2014-07-03     | ABSENT       
7    | 41    | 2014-08-01     | PRESENT    

我想选择最大 PE_DATE_EXAM 值,其中 idnum = 39 且 ATTENDANCE=PReSENT

结果应该是:

PEID |idnum  | PE_DATE_EXAM   | ATTENDANCE
-------------------------------------------
3    | 39    | 2014-08-12     | PRESENT

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    对于单个记录返回,您可以使用LIMIT

    SELECT * FROM tblPE t
    WHERE t.idnum = 39 AND t.ATTENDANCE = 'PRESENT'
    ORDER BY t.PE_DATE_EXAM DESC
    LIMIT 1;
    

    如果您希望所有idnum 的动态,您可以使用NOT EXISTS()

    SELECT * FROM tblPE t
    WHERE NOT EXISTS(SELECT 1 FROM tblPE s
                     WHERE t.idnum = s.idnum AND s.ATTENDANCE = 'PRESENT')
      AND t.attendance = 'PRESENT'
    

    【讨论】:

    • 不小心把ORDER BY t.PE_DATE_EXAM DESC放在WHERE ..前面
    • 我照你说的做了,但它出错了..
    • 错误 SQL 查询:文档 SELECT * FROM tblPE t ORDER BY t.PE_DATE_EXAM DESC WHERE t.idnum = 39 AND t.ATTENDANCE = 'PRESENT' LIMIT 1 LIMIT 0, 25 MySQL 说:文档 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'WHERE t.idnum =39 AND t.ATTENDANCE = 'PRESENT' LIMIT 0, 25' 附近使用正确的语法
    • @StrongMan 我的错,我把ORDER BY放在WHERE子句之前,现在试试
    【解决方案2】:

    您可以使用相关子查询来查找特定 ID 的最大日期。我个人觉得这更易读,更直接。此外,这种方法通常与语言无关(假设我们指的是关系 SQL 数据库)https://en.wikipedia.org/wiki/Correlated_subquery

    SELECT * 
    FROM tblPE t1
    WHERE t1.Date = (
                     SELECT MAX(Date)
                     FROM tblPE t2
                     WHERE t1.Id = t2.Id
                    )
    AND t1.Id = 39;
    

    【讨论】:

    • 是的,但它只是比不相关的查询慢一点
    • @Strawberry 是的,你的性能确实受到了一些影响,这是一件好事!根据我的经验,只有当您开始达到相当大的数据集大小时,它才会真正变得痛苦。但对于中小型数据集,一个应该没问题。
    【解决方案3】:

    对于更通用的解决方案:

    SELECT PEID, idnum, PE_DATE_EXAM, ATTENDANCE
    FROM tblPE
    WHERE idnum = 39 AND ATTENDANCE = 'PRESENT' AND PE_DATE_EXAM in (
       SELECT MAX(PE_DATE_EXAM)
       FROM tblPE
       WHERE idnum = 39 AND ATTENDANCE = 'PRESENT')
    

    【讨论】:

      【解决方案4】:
        SELECT top 1 * FROM tblPE t
        WHERE t.idnum = 39 AND t.ATTENDANCE = 'PRESENT' ORDER BY t.PE_DATE_EXAM DESC;
      

      【讨论】:

      • TOP 1 是 SQL-Server 语法。
      【解决方案5】:
      select PEID,IDNUM,PE_DATE_EXAM,ATTENDANCE
      from
      (select PEID,IDNUM,PE_DATE_EXAM,ATTENDANCE,dense_rank() over(order by PE_DATE_EXAM desc) rnum
      from TBLPE
      order by PE_DATE_EXAM desc)
      where rnum = '1';
      

      此查询是根据您的查询结果编写的。如果您需要任何澄清,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 2016-09-25
        • 2021-04-30
        相关资源
        最近更新 更多