SQL选择使用max(算术(value1,value2))连接行

SQL选择使用max(算术(value1,value2))连接行,sql,sql-server,Sql,Sql Server,我正在尝试建立一个交易系统,人们可以在这个系统中提供他们想要的商品。系统中有两种货币,黄金和白银。100银=1金。请注意,人们可以提供与其他人相同的价格,因此可能存在重复的最高报价 表结构大致如下所示 Trade table ID TradeOffer table ID UserID TradeID references Trade(ID) GoldOffer SilverOffer 我想向用户显示一个按最高出价排序的交易列表,只要他们搜索有限制的交易 理想的输出与此类似

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

表结构大致如下所示

Trade table  
ID


TradeOffer table  
ID
UserID
TradeID references Trade(ID)  
GoldOffer  
SilverOffer 
我想向用户显示一个按最高出价排序的交易列表,只要他们搜索有限制的交易

理想的输出与此类似

Trade.ID TradeOffer.ID HighestGoldOffer HighestSilverOffer UserID Trade.ID TradeOffer.ID HighestGoldOffer HighestSilverOffer用户ID 其中,
HighestGoldOffer
HighestSilverOffer
GoldOffer
SilverOffer
列的值,具有最高(GoldOffer*100+SilverOffer)和
UserID
的用户

我知道我可以运行两个独立的查询,一个用于检索满足所有约束的所有交易,并提取所有ID以运行另一个查询以获得最高报价,但我是一个完美主义者,因此我更喜欢使用一个sql而不是两个sql

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


希望我能说清楚,谢谢大家的帮助

模型和测试数据

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


您应该搜索窗口功能,我想这可能就是您要搜索的功能。(假设您的sql语言支持这一点)您使用的是哪种DBMS?博士后?Oracle?@a_horse_,目前正在使用SQLServer,但可能需要迁移到Mysql@Beta033你能再解释一下吗?我不认为我读的是我想要的。我将删除我的答案,直到我有时间为每个窗口正确选择一个结果,这样其他人就不会被误导。