2010-03-28 42 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