SQL 最大值但也显示其他列的值
SQL Max Value But Also Displaying Values From Other Columns
我从几个不同的 table 中提取数据以提供以下示例数据。为简单起见,示例数据仅显示一个 OrderID。我需要做的是获取 OrderID 的最高价格行,但我还需要查看与该特定行关联的其他 ID,如下面的期望结果 table 所示。有什么办法可以实现吗?
我正在 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
提前致谢!
我会推荐 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
请注意,我稍微更改了查询:
可以优化日期过滤 - 不要在日期列上应用日期函数(它会排除列上的现有索引)
table 别名使查询更易于编写和阅读
我从几个不同的 table 中提取数据以提供以下示例数据。为简单起见,示例数据仅显示一个 OrderID。我需要做的是获取 OrderID 的最高价格行,但我还需要查看与该特定行关联的其他 ID,如下面的期望结果 table 所示。有什么办法可以实现吗?
我正在 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
提前致谢!
我会推荐 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
请注意,我稍微更改了查询:
可以优化日期过滤 - 不要在日期列上应用日期函数(它会排除列上的现有索引)
table 别名使查询更易于编写和阅读