【问题标题】:select latest entry per day and corresponding data选择每天最新的条目和相应的数据
【发布时间】:2009-09-02 00:52:11
【问题描述】:

我在 SQLite 中有一个表:

CREATE TABLE test_results(timestamp TEXT, npass INTEGER, nfails INTEGER)

我想返回每天的最后一次通过/失败信息。例如,如果表包含...

2009-08-31 23:30:19|0|24 2009-08-31 23:37:18|0|24 2009-08-31 23:40:00|0|24 2009-09-01 19:02:13|0|2 2009-09-01 19:08:24|2|0 2009-09-01 19:20:29|2|0

我想要一个 select 语句返回...

2009-08-31 23:40:00|0|24 2009-09-01 19:20:29|2|0

提前致谢!

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    试试:

    SELECT t.timestamp,
           t.npass,
           t.nfails
      FROM TEST_RESULTS t
      JOIN (SELECT MAX(tt.timestamp) 'maxtimestamp'
             FROM TEST_RESULTS tt
         GROUP BY date(tt.timestamp)) m ON m.maxtimestamp = t.timestamp
    

    【讨论】:

      【解决方案2】:

      你可以试试这个查询:

      SELECT * FROM (select * from test_results ORDER BY timestamp)
      GROUP BY date(timestamp)
      

      如果您还想每天获得第一次失败:

      SELECT * FROM (select * from test_results ORDER BY timestamp DESC)
      GROUP BY date(timestamp)
      

      【讨论】:

      • 两者都不起作用,因为 TEST_RESULTS 有三列,其中两列未包含在您的 GROUP BY 中。我也看不到 SELECT * ORDER BY 时间戳将如何检索每天的最后一个条目。
      【解决方案3】:

      这就是我解决这类问题的方法:

      SELECT t1.*
      FROM test_results t1
      LEFT OUTER JOIN test_results t2
        ON (DATE(t1.timestamp) = DATE(t2.timestamp) AND t1.timestamp < t2.timestamp)
      WHERE t2.timestamp IS NULL;
      

      这假定timestamp 列具有唯一或主键约束。否则,您每天获得超过一排的(小)机会。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多