我正在努力建立一个人们可以提供他们想要的物品的交易系统。系统中有两种货币,黄金和白银。 100银= 1金。请注意,人们可以提供与其他优惠相同的优惠,因此可能存在重复的最高优惠价格。
表结构大致与此类似
Trade table
ID
TradeOffer table
ID
UserID
TradeID references Trade(ID)
GoldOffer
SilverOffer
我想向用户显示每当他们使用约束进行搜索时按最高报价排序的交易列表。
理想输出与此类似
Trade.ID TradeOffer.ID HighestGoldOffer HighestSilverOffer UserID
其中HighestGoldOffer
和HighestSilverOffer
是最高GoldOffer
的{{1}}和SilverOffer
列的值(GoldOffer * 100 + SilverOffer)和{{ 1}}是提出要约的用户
我知道我可以运行2个单独的查询,一个用于检索满足所有约束的所有交易并提取所有ID以运行另一个查询以获得最高报价,但我是一个完美主义者所以我更愿意这样做用一个sql而不是两个。
我可以选择所有优惠(GoldOffer * 100 + SilverOffer)= MAX(GoldOffer * 100 + SilverOffer)但如果有多个人提供相同的价格,这可能会返回重复的交易。还有可能没有人在交易中提供,所以GoldOffer和SilverOffer将是空的,我仍然希望在发生这种情况时将交易显示为没有报价。
希望我自己清楚并感谢您的帮助
答案 0 :(得分:0)
模型和测试数据
CREATE TABLE Trade (ID INT)
CREATE TABLE TradeOffer
(
ID INT,
UserID INT,
TradeID INT,
GoldOffer INT,
SilverOffer INT
)
INSERT Trade VALUES (1), (2), (3)
INSERT TradeOffer VALUES
(1, 1, 1, 10, 15),
(2, 2, 1, 11, 15),
(3, 1, 2, 10, 16),
(4, 2, 2, 10, 16)
<强>查询强>
SELECT
[TradeID],
[TradeOfferID],
[HighestGoldOffer],
[HighestSilverOffer],
[UserID]
FROM (
SELECT
t.ID AS [TradeID],
tOffer.ID AS [TradeOfferID],
tOffer.GoldOffer AS [HighestGoldOffer],
tOffer.SilverOffer AS [HighestSilverOffer],
tOffer.[UserID],
RANK() OVER (
PARTITION BY t.ID
ORDER BY (([GoldOffer] * 100) + [SilverOffer]) DESC
) AS [Rank]
FROM Trade t
LEFT JOIN TradeOffer tOffer
ON tOffer.TradeID = t.ID
) x
WHERE [Rank] = 1
<强>结果强>