2010-03-28 41 views
1

我有一個投標表,如下所示:SQL查詢 - 通過多個列組,但不同的

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 

但是,這將返回所有行。沒有區別。有關解決這個問題的任何建議?

回答

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 
+0

錯誤和這意味着OP想要出價的最高出價值,但我正在尋求澄清。 – 2010-03-28 20:02:01

+0

這工作:)但我需要刷新我的知識加入... 由於AdaTheDev是第一個回答,我認爲這是公平的標記他的答案爲接受。然而,OMG小馬也給出了一個很好的解釋:) – 2010-03-28 20:20:11

0

大概是最高的出價作出最近一段時間,對不對?所以只需在BidTime上輸入MAX

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

MAX(bidtime)不保證與MAX(金額)值相關聯。 – 2010-03-28 20:02:32

+0

這將是明顯的情況,但不幸的是,我不確認要出價的出價是否高於當前最高出價。 – 2010-03-28 20:03:33

+0

大多數出價系統不允許您提交比以前更低的新出價,因此並不總是無效的假設。 – Gabe 2010-03-28 20:24:26

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 
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 

使用聚合意味着你不能在同一個查詢中給定的值獲取信息。您必須將表格副本與彙總數據(聯合是典型選擇)關聯以獲取相關信息。

+0

這是不正確的,可能會導致記錄被排除,因爲它在** all **'sellid'中獲得了'cusid'的最高出價。如果同一'cusid'已經對多個'sellid'投標,並且他們對'sellid <> 10'投標更高,則'group by'將返回更高的值,這將不匹配'b'中的任何內容,這是由於限制性where子句,導致該行被過濾掉。 – RedFilter 2010-03-28 21:01:12

+0

@OrbMan:更正了,謝謝。 – 2010-03-28 21:09:41