1

我有一个投标表,如下:

SellID INT FOREIGN KEY REFERENCES SellItem(SellID),
CusID INT FOREIGN KEY REFERENCES Customer(CusID),
Amount FLOAT NOT NULL,
BidTime DATETIME DEFAULT getdate()

现在在我的网站中,我需要向用户显示当前的出价;只有最高出价,但不重复同一用户。

  SELECT CusID, 
         Max(Amount) 
    FROM Bid 
   WHERE SellID = 10 
GROUP BY CusID 
ORDER BY Max(Amount) DESC

这是我迄今为止取得的最好成绩。这给出了每个用户的最高出价的 CusID,并按升序排列。但我也需要为每个结果获取 BidTime。当我尝试将 BidTime 放入查询时:

  SELECT CusID, 
         Max(Amount), 
         BidTime 
    FROM Bid 
   WHERE SellID = 10 
GROUP BY CusID 
ORDER BY Max(Amount) DESC 

我被告知“列 'Bid.BidTime' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。”

因此我尝试了:

  SELECT CusID, Max(Amount), BidTime 
    FROM Bid 
   WHERE SellID = 10 
GROUP BY CusID, BidTime 
ORDER BY Max(Amount) DESC

但这会返回所有行。没有区别。有关解决此问题的任何建议?

4

4 回答 4

2

采用:

  SELECT b.cusid,
         b.amount,
         b.bidtime
    FROM BID b
    JOIN (SELECT t.cusid,
                 t.sellid,
                 MAX(t.amount) AS max_amount
            FROM BID t
           WHERE t.sellid = 10
        GROUP BY t.cusid, t.sellid) x ON x.max_amount = b.amount
                                     AND x.cusid = b.cusid
                                     AND x.sellid = b.sellid
ORDER BY b.amount DESC

使用聚合意味着您无法在同一查询中获取该给定值的信息。您必须将表的副本与聚合数据相关联(连接是典型的选择)才能获取相关信息。

于 2010-03-28T19:54:06.457 回答
1

一种方式,假设另一种思考方式是返回每个用户的最新出价:

SELECT b.cusID, b2.LatestBidTime, b.Amount 
FROM Bid b
    JOIN (
        SELECT cusID, MAX(BidTime) AS LatestBidTime
        FROM Bid
        WHERE SellID = 10
        GROUP BY cusID) b2 ON b.cusID = b2.cusID AND b.BidTime = b2.LatestBidTime
WHERE b.SellID = 10
于 2010-03-28T19:51:48.313 回答
1
select b.*
from Bid b
inner join (
    SELECT CusID, Max(Amount) as MaxBid
    FROM Bid 
    WHERE SellID=10 
    GROUP BY CusID 
) bm on b.CusID = bm.CusID and b.Amount = bm.MaxBid
where b.SellID = 10
ORDER BY b.Amount DESC 
于 2010-03-28T19:53:05.580 回答
0

大概是最近出价最高的吧?所以也穿上吧MAXBidTime

SELECT CusID, Max(Amount), MAX(BidTime)
FROM Bid 
WHERE SellID=10 
GROUP BY CusID ORDER BY Max(Amount) DESC 
于 2010-03-28T19:52:29.390 回答