SQL选择用max连接行(arithmatic(value1,value2))

时间:2014-04-10 21:55:08

标签: sql sql-server

我正在努力建立一个人们可以提供他们想要的物品的交易系统。系统中有两种货币,黄金和白银。 100银= 1金。请注意,人们可以提供与其他优惠相同的优惠,因此可能存在重复的最高优惠价格。

表结构大致与此类似

Trade table  
ID


TradeOffer table  
ID
UserID
TradeID references Trade(ID)  
GoldOffer  
SilverOffer 

我想向用户显示每当他们使用约束进行搜索时按最高报价排序的交易列表。

理想输出与此类似

Trade.ID    TradeOffer.ID    HighestGoldOffer    HighestSilverOffer    UserID

其中HighestGoldOfferHighestSilverOffer是最高GoldOffer的{​​{1}}和SilverOffer列的值(GoldOffer * 100 + SilverOffer)和{{ 1}}是提出要约的用户

我知道我可以运行2个单独的查询,一个用于检索满足所有约束的所有交易并提取所有ID以运行另一个查询以获得最高报价,但我是一个完美主义者所以我更愿意这样做用一个sql而不是两个。

我可以选择所有优惠(GoldOffer * 100 + SilverOffer)= MAX(GoldOffer * 100 + SilverOffer)但如果有多个人提供相同的价格,这可能会返回重复的交易。还有可能没有人在交易中提供,所以GoldOffer和SilverOffer将是空的,我仍然希望在发生这种情况时将交易显示为没有报价。

希望我自己清楚并感谢您的帮助

1 个答案:

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

<强>结果

enter image description here