【问题标题】:Fetching multiple records while sampling epoch timestamp feild from MySQL table?从 MySQL 表中采样时代时间戳字段时获取多条记录?
【发布时间】:2013-05-28 06:53:16
【问题描述】:

我有一张桌子,上面有

TimeStamp     |  Feild1      | Feild 2
--------------------------------------
1902909002    |  xyddtz      | 233447
1902909003    |  xytzff      | 233442
1902909005    |  xytzdd      | 233443
1902909007    |  xytzdd      | 233443
1902909009    |  xytsqz      | 233436

现在我想查询它并获取 1902909002 和 1902909007 之间的记录,这很容易做到:

Select * from table where timestamp > 1902909001 AND timestamp < 1902909008

但我想做的还有两件事是:

  1. 也许那个特定的时间戳不存在所以我必须找到最接近的值
  2. 如果该范围内有 200 条记录,但我只想获取 20 条,所以我想连续跳过每 19 条记录并获取第 20 条、第 40 条等记录。
  3. 我将有日期时间格式的日期。我知道我可以在查询之前对其进行转换,但如果查询本身有一些选项,那就更好了。

【问题讨论】:

  • 不要将时间戳存储为 int 只使用 TIMESTAMP 类型
  • 当然可以,但是查询呢?

标签: asp.net mysql sql


【解决方案1】:

试试这个查询

select * from(
select @rn:=if(@rn < rid, rid, @rn) as rn,  rid, timestamp, feild1, feild2
from 
(select @rn:=@rn+1 as rId, tbl.* 
from tbl
join
(select @rn:=0) tmp
where timestamp between 1902909002 and 1902909024 order by rid desc)a
join
(select @rn:=0)tmp)tmp
where rid%(rn div 6)=0

SQL FIDDLE

【讨论】:

  • +1 做得很好 :) 有点过于复杂,而且他说每 20 条记录而不是每 6 条记录
  • 事实上,即使我觉得它有点复杂:P。我们可以根据用户需求进行更改
【解决方案2】:

试试这个(在同一个 mysql 会话中执行两个查询至关重要):

SET @c:=0;
SELECT
    *
FROM (
    SELECT 
        * ,
        @c:=@c+1  as counter
    FROM 
        table 
    WHERE 
        timestamp > 1902909001 
        AND timestamp < 1902909008
) as tmp
WHERE
    counter % 20 =1;

【讨论】:

  • 如果按日期戳过滤的记录总数为 20,则应返回所有记录,为此,您的 where 子句将失败,就好像有 20 条记录您只返回 1 条记录一样。我面临同样的情况,为了解决这个问题,我不得不进行如此复杂的查询......
  • 从他的问题中,我了解到他想从该集合中获取每 20 行...如果范围有 20 行,那么我不明白,然后将它们全部返回
  • 实际上我想对这些读数进行采样..我将动态决定是否有 2000 个读数然后我只想要 100 个奇数读数来绘制一些图表,如果想要绘制时间 = 10 秒的图表,那么我会读取所有读数.. 在这个场景中执行这个查询会有一些错误吗??? @斯蒂芬
猜你喜欢
  • 2016-12-30
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多