sql最大值,但也显示其他列的值

wh6knrhe  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(324)

我从几个不同的表中提取数据,以提供以下示例数据。为了简单起见,示例数据只显示了一个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

提前谢谢!

q35jwt9p

q35jwt9p1#

我建议你 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

请注意,我稍微更改了查询:
对日期的过滤可以优化-不要对日期列应用日期函数(它排除了列上现有的索引)
表别名使查询更易于编写和读取

相关问题