繁体   English   中英

SQLite / Java将每个名称的最新时间戳与24小时前的时间戳进行比较

[英]SQLite / Java Compare most recent time stamp with one from 24hr ago for each name

我正在尝试从最近的时间戳记中获取数据,并从24小时前获取表中每个名称的时间戳记。 我当前的方法进行两个单独的查询,并将结果合并。 但是,这很慢,并且也阻止了我对数据进行排序(通过注释等)

以下查询获取24小时前(最后一次)的数据

SELECT Price, comment ,name, timestamp
FROM details INNER JOIN car ON details .ID=car.ID
WHERE timestamp >= datetime('now','-1 day') and name = 'BMW'
order by timestamp asc limit 1

然后,我有另一个类似的查询,该查询返回带有最近时间戳记的数据(第一个)。

我在Java中有一个方法,其中包含上述查询,并将新的汽车名称传递到name =“”部分。 这将返回每辆车的第一个和最后一个,然后我比较价格和评论详细信息并返回结果。

但是,事实证明这是一个非常缓慢的过程。 这也意味着我无法高效地订购结果。

我也尝试过使用Union,但是它确实提供了预期的结果

SELECT Price, comment ,name, max(timestamp)
FROM details INNER JOIN name ON details .ID=name .ID

UNION
SELECT Price, comment,name, min(timestamp)
FROM details  INNER JOIN name ON details .ID=name .ID
WHERE timestamp >= datetime('now','-1 day')
group by name
order by comment desc
limit 40

执行此查询的正确方法是什么?

假设cars.name是唯一的(即等同于cars.id ,并且您希望将结果放在单独的行上),则可以在子查询中进行聚合以获取两个时间戳。然后,加入所需的其他信息:

SELECT c.name, d.Price, d.comment, d.name, d.timestamp
FROM car c JOIN
     details d 
     ON d.ID = c.ID JOIN
     (SELECT dd.ID, MAX(dd.timestamp) as maxts, MIN(dd.timestamp) as mints
      FROM detail dd
      WHERE dd.timestamp >= datetime('now', '-1 day')
      GROUP BY dd.ID
     ) dd
     ON dd.ID = c.ID AND d.timestamp IN (dd.mints, dd.maxts)
ORDER BY timestamp asc;

要为每个名称获得一个输出行,请使用GROUP BY:

SELECT Price, comment, name, max(timestamp)
FROM details INNER JOIN name USING (ID)
GROUP BY name.ID

UNION ALL

SELECT Price, comment, name, min(timestamp)
FROM details INNER JOIN name USING (ID)
WHERE timestamp >= datetime('now','-1 day')
GROUP BY name.ID

ORDER BY ...;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM