Дополнительное условие для равных значений с помощью функции MAX () - PullRequest
0 голосов
/ 21 октября 2018

У меня есть простая база данных для аукционов.Она включает в себя таблицу с предложениями.

+---------+---------+--------+------------+
| item_id | user_id | amount |    time    |
+---------+---------+--------+------------+
|       3 |       2 |    500 | 1540152972 |
|       3 |       4 |    500 | 1540151466 |
+---------+---------+--------+------------+

В конце аукциона мне нужно выяснить, какие пользователи выиграли какие предметы (наибольшая сумма).Я рассмотрел следующий запрос для этого

SELECT item_id, user_id, MAX(amount)
FROM auction_bids
GROUP BY item_id

, который работает нормально, пока несколько пользователей не сделали ставку с одинаковой суммой.

В этом случае мне нужно получитьсамое раннее (то есть: самое низкое time значение).

Как мне включить это в мой запрос GROUP BY?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

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

SELECT item_id, user_id, amount
FROM auction_bids a1
WHERE NOT EXISTS (select 1 from auction_bids a2
                  where a2.item_id = a1.item_id
                    and (a2.amount > a1.amount
                         or (a2.amount = a1.amount and a2.time < a1.time)))
0 голосов
/ 21 октября 2018

Нет, это фильтрация, а не агрегация:

SELECT ab.*
FROM auction_bids ab
WHERE ab.amount = (SELECT MAX(ab2.amount)
                   FROM auction_bids ab2
                   WHERE ab2.item_id = ab.item_id
                  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...