Запрос, чтобы найти максимум значения с несколькими группами по атрибутам - PullRequest
0 голосов
/ 02 июля 2019

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

Я могу получить результаты в двух разных запросах, каждый из которых возвращает подмножество того, что я хочу

select username, auctionbids.itemid, description, bidamt from AuctionBids 
inner join users on auctionbids.userid = users.id
inner join auctionitems on auctionbids.itemid = auctionitems.itemid

select ab.itemid,max(ab.bidamt) as bidmax from auctionbids as ab group by ab.itemid

Я хочу получить имя пользователя, itemid, описание товара, max (bidamt), объединяющее три таблицы - пользователи, аукционы, аукционы.

пользователи содержат ИД пользователя и имя пользователя

аукцион содержит элементы itemid и описание товара

аукцион содержит ставки: идентификатор пользователя, itemid, bidamt

Ответы [ 4 ]

1 голос
/ 02 июля 2019

Следующий запрос должен делать то, что вы хотите:

SELECT a.item_description,a.username,a.bidamt FROM 
(
SELECT au.item_description,u.username,ab.bidamt, RANK() OVER(PARTITION BY au.itemid ORDER BY ISNULL(ab.bidamt,0) DESC) AS [Rank]
FROM auctionitems au
LEFT JOIN auctionbids ab ON au.itemid = ab.itemid
LEFT JOIN users u ON ab.userid = u.userid ) a WHERE [Rank] = 1
1 голос
/ 02 июля 2019

Как вы сказали, каждый из двух разных запросов возвращает подмножество того, что вы хотите, ваш запрос должен выглядеть так:

SELECT am.username, am.itemid, am.descripton, max(am.bidamt) AS bidmax
FROM (
    SELECT username, auctionbids.itemid, auctionitems.description, bidamt FROM AuctionBids 
    INNER JOIN users ON auctionbids.userid = users.id
    INNER JOIN auctionitems ON auctionbids.itemid = auctionitems.itemid
) AS am 
GROUP BY am.itemid
0 голосов
/ 03 июля 2019

Спасибо за идеи, которые привели к этому запросу -

SELECT am.*, auctionbids.submitted, users.username, auctionitems.description 
FROM
(SELECT ab.itemid, max(ab.bidamt) as bidmax 
FROM 
auctionbids ab
GROUP BY ab.itemid) AS am
   INNER JOIN auctionbids ON am.itemid = auctionbids.itemid and am.bidmax = auctionbids.bidamt
    INNER JOIN users ON auctionbids.userid = users.id
    INNER JOIN auctionitems ON auctionbids.itemid = auctionitems.itemid

Таким образом, в основном max должен быть найден для группы по itemid, а затем для внутреннего соединения с остальными таблицами для получения атрибутов.

0 голосов
/ 02 июля 2019

Без примеров данных невозможно убедиться, что это работает правильно.Но вам нужно будет сопоставить bidamt с MAX bidamt для определенного элемента.

SELECT DISTINCT
    users.username,
    auctionbids.itemid,
    auctionitems.description,
    auctionbids.bidamt

FROM
    users
        INNER JOIN auctionbids on users.userid = auctionbids.userid
        INNER JOIN auctionitems on auctionbids.itemid = auctionitems.itemid

WHERE
    auctionbids.bidamt = (SELECT MAX(bidamt) OVER (PARTITION BY itemid, description))
    AND
    itemid = < whatever you want >  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...