SQL 最大值但也显示来自其他列的值

Posted

技术标签:

【中文标题】SQL 最大值但也显示来自其他列的值【英文标题】:SQL Max Value But Also Displaying Values From Other Columns 【发布时间】:2020-10-14 00:00:52 【问题描述】:

我从几个不同的表中提取了数据,以提供以下示例数据。为简单起见,示例数据仅显示一个 OrderID。我需要做的是获取 OrderID 的最高价格行,但我还需要查看与该特定行关联的其他 ID,如下面的所需结果表所示。有什么办法可以实现吗?

我正在用 SQL 为这些数据创建一个视图,如果可能的话,我想在一个视图中完成所有操作。

当前代码

SELECT        Items.OrderID, Items.ItemID, Items.Code, Price.Price
FROM            Items LEFT OUTER JOIN
                         Codes ON Items.Code = Codes.Code LEFT OUTER JOIN
                         ItemCategories ON Codes.CategoryID = ItemCategories.CategoryID LEFT OUTER JOIN
                         Price ON Codes.CodeGrouping = Price.CodeGrouping
WHERE        (YEAR(Items.Date) = YEAR(GETDATE()) OR
                         YEAR(Items.Date) = YEAR(GETDATE()) - 1) AND (ItemCategories.CategoryID = 1) AND (Items.OrderID_Status = 3)

样本数据

OrderID     ItemID     Code     Price
--------------------------------------
454646      429264     12121    833
454646      429677     6116     1
454646      431168     194      719
454646      431248     6078     1
454646      432023     455      1030

期望的结果

OrderID     ItemID     Code     Max_Price
-----------------------------------------------------
454646      432023     455      1030

提前致谢!

【问题讨论】:

您能否发布您运行的查询以获取此结果? 现在添加了当前代码 【参考方案1】:

我会推荐row_number(),因为它很容易集成到现有查询中:

select *
from (
    select 
        t.*, 
        row_number() over(partition by orderid order by price desc) rn
    from mytable t
) t
where rn = 1

在您的原始查询中:

SELECT *
FROM (
    SELECT        
        i.OrderID, 
        i.ItemID, 
        i.Code, 
        p.Price,
        ROW_NUMBER() OVER(PARTITION BY i.OrderID ORDER BY p.Price DESC) rn
    FROM Items i
    LEFT JOIN Codes c           ON i.Code = c.Code 
    LEFT JOIN ItemCategories ic ON c.CategoryID = ic.CategoryID 
    LEFT JOIN Price p           ON c.CodeGrouping = p.CodeGrouping
    WHERE
        i.Date >= DATEFROMPARTS(YEAR(GETDATE()) - 1, 1, 1)
        AND i.Date < DATEFROMPARTS(YEAR(GETDATE()) + 1, 1, 1)
        AND ic.CategoryID IN (1, 3)
) t
WHERE rn = 1

请注意,我稍微更改了查询:

可以优化对日期的过滤 - 不要在日期列上应用日期函数(它会排除列上的现有索引)

表别名使查询更易于编写和阅读

【讨论】:

感谢 GMB,我如何将它添加到我原始帖子中的代码中? 你是救生员!那工作完美无缺。也感谢您的提示。

以上是关于SQL 最大值但也显示来自其他列的值的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:获取对应于组中其他列的最大值的列的值

如何检索表的值以获取sql中两列的最大值

Sql Server 查询,一共三列,怎样查出第一个列值相同,第二列值最大的第三列的值?

如何修改MySql自增列的值

SQL:获取一列和相应的其他列的最大值[重复]

sql选择某一列的最大值与最小值并在同一列中显示