【问题标题】:SQLite / Java Compare most recent time stamp with one from 24hr ago for each nameSQLite / Java 将每个名称的最新时间戳与 24 小时前的时间戳进行比较
【发布时间】:2018-07-29 10:59:02
【问题描述】:

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

以下查询获取 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 = " " 部分。这会返回每辆车的第一个和最后一个,然后我比较价格和评论详细信息并返回结果。

然而,事实证明这是一个非常缓慢的过程。这也意味着我无法有效地排序结果。

我也尝试过联合,但它确实提供了预期的结果

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

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

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 这是否意味着java端有很多车名(10、100、1000辆车),而java代码对每个车名分别循环调用这两个查询?如果是这样,那么这必须缓慢工作。在这种情况下,最好只触发一次查询所有汽车名称的数据。

标签: java sql sqlite


【解决方案1】:

要为每个名称获取一个输出行,请使用 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 ...;

【讨论】:

    【解决方案2】:

    假设 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;
    

    【讨论】:

    • 你的假设是正确的..虽然我不完全理解你的答案。有什么我需要改变她才能让查询工作吗? “ FROM detail dd ”如何工作?我收到此错误:没有这样的列:d.timestamp:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2021-03-31
    • 2013-01-16
    • 2012-11-06
    相关资源
    最近更新 更多