具有每列限制的SQLite查询

具有每列限制的SQLite查询,sql,database,sqlite,Sql,Database,Sqlite,我正在尝试使用where条件组合一个查询,以获得多个唯一的排序列,而不必在多个查询中执行此操作。这令人困惑,所以这里有一个例子 价格表 id | item_id | date | price 我想查询以查找给定日期的多个项目的最新价格。我之前在我的应用程序代码中迭代了一些项目,得到了像这样的最新价格 SELECT * FROM prices WHERE item_id = ? AND date(date) < date(?) ORDER BY date(date) DESC LIMIT

我正在尝试使用where条件组合一个查询,以获得多个唯一的排序列,而不必在多个查询中执行此操作。这令人困惑,所以这里有一个例子

价格表

id | item_id | date | price
我想查询以查找给定日期的多个项目的最新价格。我之前在我的应用程序代码中迭代了一些项目,得到了像这样的最新价格

SELECT * FROM prices WHERE item_id = ? AND date(date) < date(?) ORDER BY date(date) DESC LIMIT 1
迭代每个项目并执行查询太慢,所以我想知道是否有一种方法可以一次性完成多个项目的相同查询。我已经尝试了UNION,但我无法让它使用ORDER BY和LIMIT命令,就像这条针对MySQL的线程所说的


关于我如何做到这一点有什么想法吗

根据以下条件进行调整:


sqlite 3.25及更新版本提供的窗口功能可能有助于:

WITH ranked AS
 (SELECT id, item_id, date, price
       , row_number() OVER (PARTITION BY item_id ORDER BY date DESC) AS rn
  FROM prices
  WHERE date < ?)
SELECT id, item_id, date, price
FROM ranked
WHERE rn = 1
ORDER BY item_id;
将从早于给定日期的所有记录中返回每个项的最新id

I would simply use a correlated subquery in the `where` clause:

SELECT p.*
FROM prices p
WHERE p.DATE = (SELECT MAX(p2.date)
                FROM prices p2
                WHERE p2.item_id = p.item_id
               );
这是一个短语,因此它适用于所有项目。当然,您可以在外部查询中为给定的项目集添加过滤条件。

不存在:

或通过表与查询的联接,该查询返回每个项目\u id的最后日期:

I would simply use a correlated subquery in the `where` clause:

SELECT p.*
FROM prices p
WHERE p.DATE = (SELECT MAX(p2.date)
                FROM prices p2
                WHERE p2.item_id = p.item_id
               );
SELECT p.* FROM prices p
WHERE NOT EXISTS (
  SELECT 1 FROM prices
  WHERE item_id = p.item_id AND date > p.date
)
SELECT p.*
FROM prices p INNER JOIN (
  SELECT item_id, MAX(date) date
  FROM prices 
  GROUP BY item_id
) t ON t.item_id = p.item_id AND t.date = p.date