【问题标题】:Select first row in a group选择组中的第一行
【发布时间】:2014-01-17 21:21:10
【问题描述】:

我正在使用此查询在一小时内获取第一个数据条目:

select * 
from
(   
    select time_stamp, value 
    from tbl 
    order by time_stamp desc
) 
group by strftime('%m%d%H',time_stamp) 
order by time_stamp;

它给了我正确的结果,但是由于大量数据点和有限的硬件资源而速度很慢。 当不在 GROUP 之前排序时,它会快得多,但是我会从小时的随机部分获取值。 有什么建议吗?

返回值示例:

select ts, t1 from temperatura group by strftime('%m%d%H',ts) order by ts limit 5;
2013-12-22 09:59:01|22062
2013-12-22 10:59:02|21937
2013-12-22 11:59:02|21937
2013-12-22 12:57:02|22000
2013-12-22 13:59:02|21625

select * from(select ts, t1 from temperatura order by ts desc) group by strftime('%m%d%H',ts) order by ts limit 5;
2013-12-22 09:58:48|22000
2013-12-22 10:00:02|22000
2013-12-22 11:00:02|21937
2013-12-22 12:00:02|21937
2013-12-22 13:19:41|21812

如您所见,我得到了不同的答案。第二个是我想要的。

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    在 SqlLite 中,使用限制 10 代替前 10 个

    SELECT ts, t1 
    FROM 
    (
        select ts, t1
        from temperatura 
        order by ts desc
    )
    group by strftime('%m%d%H',ts)
    order by ts
    Limit 10; 
    

    【讨论】:

      【解决方案2】:

      除非我在问题中遗漏了什么

      SELECT top 10 time_stamp, value 
      FROM 
      (
          select time_stamp, value
          from tbl 
          order by time_stamp desc
      )
      group by strftime('%m%d%H',time_stamp)
      order by time_stamp; 
      

      和 SqlLite 中的等价物:

      How to get Top 5 records in SqLite?

      也许不需要两次订购

      【讨论】:

      • A group by 进行隐式排序。正如您所建议的那样,子选择中的排序应该是不必要的。
      • 显然它不在 SQLite3 中,如示例所示。或者我搞错了
      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 2015-11-28
      • 2016-02-25
      相关资源
      最近更新 更多