【问题标题】:sql query to get earliest datesql查询获取最早日期
【发布时间】:2010-03-06 18:16:24
【问题描述】:

如果我有一个包含 idnamescoredate 列的表

我想运行一个 sql 查询来获取 id = 2 在数据集中具有最早日期的记录。

您可以在查询中执行此操作,还是需要在事后循环?

我想获取该记录的所有字段..

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    如果你只想要日期:

    SELECT MIN(date) as EarliestDate
    FROM YourTable
    WHERE id = 2
    

    如果您想要所有信息:

    SELECT TOP 1 id, name, score, date
    FROM YourTable
    WHERE id = 2
    ORDER BY Date
    

    尽可能避免循环。循环通常会导致游标,而游标几乎从不需要,而且通常效率很低。

    【讨论】:

    • 如果我也想得到这个记录的名字怎么办
    【解决方案2】:
    SELECT TOP 1 ID, Name, Score, [Date]
    FROM myTable
    WHERE ID = 2
    Order BY [Date]
    

    【讨论】:

      【解决方案3】:

      虽然使用 TOP 或子查询都可以,但我会将问题分解为几个步骤:

      查找目标记录

      SELECT MIN( date ) AS date, id
      FROM myTable
      WHERE id = 2
      GROUP BY id
      

      加入获取其他领域

      SELECT mt.id, mt.name, mt.score, mt.date
      FROM myTable mt
      INNER JOIN
      ( 
         SELECT MIN( date ) AS date, id
         FROM myTable
         WHERE id = 2
         GROUP BY id
      ) x ON x.date = mt.date AND x.id = mt.id
      

      虽然这个使用派生表的解决方案更长,但它是:

      • 更容易测试
      • 自我记录
      • 可扩展

      由于部分查询可以独立运行,因此更容易测试。

      它是自我记录的,因为查询直接反映了需求 即派生表列出了id = 2且日期最早的行。

      它是可扩展的,就好像需要另一个条件一样,这可以很容易地添加到派生表中。

      【讨论】:

        【解决方案4】:

        试试

        select * from dataset
        where id = 2
        order by date limit 1
        

        我做sql已经有一段时间了,所以这可能需要一些调整。

        【讨论】:

          【解决方案5】:

          使用“limit”和“top”不适用于所有 SQL 服务器(例如 Oracle)。 你可以在纯sql中尝试更复杂的查询:

          select mt1.id, mt1."name", mt1.score, mt1."date" from mytable mt1
          where mt1.id=2
          and mt1."date"= (select min(mt2."date") from mytable mt2 where mt2.id=2)
          

          【讨论】:

          • 如果有相同的最小日期的行,这可以返回多行。
          猜你喜欢
          • 2016-04-13
          • 1970-01-01
          • 2021-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-14
          • 2021-06-26
          相关资源
          最近更新 更多