Sql 查询以查找具有多个group by属性的值的最大值

Sql 查询以查找具有多个group by属性的值的最大值,sql,azure-sql-database,Sql,Azure Sql Database,我正在尝试获取某个特定项目的最大出价金额,并显示已出价该金额的用户 我能够在两个不同的查询中得到结果,每个查询返回我想要的内容的子集 select username, auctionbids.itemid, description, bidamt from AuctionBids inner join users on auctionbids.userid = users.id inner join auctionitems on auctionbids.itemid = auctionite

我正在尝试获取某个特定项目的最大出价金额,并显示已出价该金额的用户

我能够在两个不同的查询中得到结果,每个查询返回我想要的内容的子集

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、ItemDescripton、maxbidamt加入三个表——users、auctionitems、auctionbids

用户包含userid和username

拍卖项目包含项目ID和项目描述


auctionbids包含userid、itemid、bidamt

如果没有示例数据,则无法验证其是否正常工作。但您需要将特定项目的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 >  

如果没有示例数据,就不可能验证其是否正确工作。但您需要将特定项目的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 >  

以下查询应执行您想要的操作:

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

以下查询应执行您想要的操作:

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

正如您所说,两个不同的查询都返回您想要的内容的子集,您的查询应该是这样的:

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

正如您所说,两个不同的查询都返回您想要的内容的子集,您的查询应该是这样的:

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

谢谢你提出这个问题的想法-

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

因此,基本上,必须通过itemid上的groupby找到max,然后通过与其余表的内部连接来获取属性。

感谢导致此查询的想法-

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

因此,基本上必须在itemid上通过group by找到max,然后通过与其余表的内部连接来获取属性。

感谢您的尝试。此查询提供每个项目的每个用户的最高出价。我正在寻找每个项目的最高出价,并希望显示用户是谁。@FakhruddinBandukwala我已修改了代码,请检查这是否有助于感谢。这可以工作,但由于左连接,返回了大量空行。所以我在WHERE子句中添加了a.bidamt>0。感谢您的尝试。此查询提供每个项目的每个用户的最高出价。我正在寻找每个项目的最高出价,并希望显示用户是谁。@FakhruddinBandukwala我已修改了代码,请检查这是否有助于感谢。这可以工作,但由于左连接,返回了大量空行。因此,我将a.bidamt>0添加到WHERE子句中。我要查找的是Group by itemid,但是由于select子句的属性多于Group by,因此此查询不起作用。不过,他确实提出了一些想法。谢谢。我要的是Group by itemid,但是由于select子句的属性比Group by子句的属性多,因此此查询不起作用。不过,他确实提出了一些想法。谢谢。尝试此操作后,它将在加入表后返回所有行。尝试此操作后,它将在加入表后返回所有行。