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 最大值但也显示来自其他列的值的主要内容,如果未能解决你的问题,请参考以下文章