Как получить уникальные самые последние элементы, используя IN из таблицы в PostgreSQL - PullRequest
1 голос
/ 14 апреля 2020

Сценарий

+--------+-------+------------+
|  item  | price |    date    |
+--------+-------+------------+
| apple  | 31    | 2019-09-11 |
| banana | 11    | 2019-09-11 |
| banana | 13.23 | 2019-10-12 |
| apple  | 30.1  | 2019-10-12 |
| banana | 12.77 | 2019-10-31 |
| apple  | 32    | 2019-11-28 |
| banana | 15.6  | 2019-11-02 |
| banana | 12.8  | 2019-12-18 |
| apple  | 33.45 | 2020-01-12 |
| banana | 16.78 | 2020-01-21 |
| apple  | 31.5  | 2020-01-27 |
| banana | 14.4  | 2020-02-17 |
| banana | 13.2  | 2020-03-12 |
+--------+-------+------------+

У меня есть таблица цен, из которой я пытаюсь получить цену как на банан, так и на яблоко из 100+ фруктов, используя следующий SQL запрос

SELECT * 
FROM prices
WHERE item IN ('apple','banana')
ORDER BY date DESC
LIMIT 2;

Issue

Этот запрос возвращает мне последние две цены из всей таблицы, которые оба для банана. Тем не менее, я хочу самую последнюю цену для Apple и Banana

Ожидаемый

+--------+-------+------------+
| apple  | 31.5  | 2020-01-27 |
| banana | 13.2  | 2020-03-12 |
+--------+-------+------------+

Текущий

+--------+-------+------------+
| banana | 14.4  | 2020-02-17 |
| banana | 13.2  | 2020-03-12 |
+--------+-------+------------+

Как я могу достичь этого?

1 Ответ

2 голосов
/ 14 апреля 2020

Использование distinct on:

SELECT DISTINCT ON (p.item) p.* 
FROM prices p
WHERE item IN ('apple', 'banana')
ORDER BY p.item, p.date DESC
...