SQLite-запрос с LIMIT на столбец - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь составить запрос с условием where, чтобы получить несколько уникальных отсортированных столбцов без необходимости делать это в нескольких запросах. Это сбивает с толку, так что вот пример ...

Ценовая таблица

id | item_id | date | price

Я хочу запросить, чтобы найти самую последнюю цену для нескольких товаров с указанной датой. Ранее я перебирал элементы в коде своего приложения и получал самую последнюю цену, подобную этой ...

SELECT * FROM prices WHERE item_id = ? AND date(date) < date(?) ORDER BY date(date) DESC LIMIT 1

Перебор каждого элемента и выполнение запроса слишком медленное, поэтому мне интересно, есть ли способ Я могу выполнить sh этот же запрос для нескольких элементов в одном go. Я пробовал UNION, но не могу заставить его работать с командами ORDER BY и LIMIT, как в этой теме ({ ссылка }) для MySQL

Любые идеи о том, как я могу сделать это sh?

Ответы [ 4 ]

0 голосов
/ 02 февраля 2020

С NOT EXISTS:

SELECT p.* FROM prices p
WHERE NOT EXISTS (
  SELECT 1 FROM prices
  WHERE item_id = p.item_id AND date > p.date
)

или с соединением таблицы с запросом, который возвращает последние date для каждого item_id:

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
0 голосов
/ 02 февраля 2020

Оконные функции (доступны в 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;

вернет самые последние из каждого item_id из всех записей старше указанной даты.

0 голосов
/ 02 февраля 2020
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
               );

Это фраза, поэтому она работает на всех предметах. Конечно, вы можете добавить условия фильтрации (во внешний запрос) для данного набора элементов.

0 голосов
/ 02 февраля 2020

Попробуйте (на основе адаптации ответа ):

SELECT * FROM prices a WHERE a.RowId IN (
  SELECT b.RowId
    FROM prices b
    WHERE a.item_id = b.item_id AND date < ?
    ORDER BY b.item_id LIMIT 1
) ORDER BY date DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...