【问题标题】:SQL statement - get 1st minimum then 2nd minimum from joinSQL 语句 - 从连接中获取第一个最小值,然后是第二个最小值
【发布时间】:2020-06-09 18:48:56
【问题描述】:

抱歉描述太糟糕了,但我很难说出这个

我的2张桌子是这样的

tblParent..

OrderID  Customer
789      Bob

tblChild

OrderID  SortOrder  Price
789      1          20.00           
789      3          30.00

我希望我的语句的输出是 OrderID(来自 tblParent)、Customer(来自 tblParent)、Price1(这将是 20.00,因为它是 tblChild 的第一个价格(基于 SortOrder))、Price2(这将是 30.00,因为它是 tblChild 中此 OrderID 的下一个最高 SortOrder

我试过了..

SELECT A.OrderID, A.Customer, B.Price, C.Price
FROM tblParent
LEFT JOIN (SELECT Price from tblChild) B on A.OrderID=B.OrderID
LEFT JOIN (SELECT Price from tblChild) C on A.OrderID=B.OrderID

我知道我需要将MIN() 放在某个地方以获取第一个价格 (20.00),但是我该如何获取第二个最低 SortOrder 的价格?

我在做WHERE SortOrder=1 然后在下一列WHERE SortOrder=2 等等,但后来我意识到如果有人从子表中删除了一行,那么SortOrder 会丢失它的序列(因此在示例中,第 2 行被删除并且这就是为什么它的 1 后跟 3)。

真的希望有人可以帮忙。谢谢。

【问题讨论】:

    标签: sql database group-by pivot window-functions


    【解决方案1】:

    如果您的数据库(您没有标记)支持窗口函数,您可以使用row_number() 和条件聚合:

    select
        orderID,
        customer,
        max(case when rn = 1 then price end) price1,
        max(case when rn = 2 then price end) price2
    from (
        select
            p.orderID,
            p.customer,
            c.sortOrder,
            c.price,
            row_number() over(partition by c.orderID order by c.sortOrder) rn
        from tblParent p
        inner join tblChild c on c.orderID = p.orderID
    ) t
    group by orderID, customer
    

    【讨论】:

    • 非常感谢您的回复,我选择了 Gordons 的回答,因为它看起来更像我习惯的左连接,但我相信您的也可以。再次感谢!
    【解决方案2】:

    您可以使用窗口函数和条件聚合:

    SELECT p.OrderID, p.Customer,
           MAX(c.PRICE),
           MAX(CASE WHEN seqnum = 2 THEN C.Price END) as price_2
    FROM tblParent p LEFT JOIN
         (SELECT c.*,
                 ROW_NUMBER() OVER (PARTITION BY OrderId ORDER BY SortOrder) as seqnum 
          FROM tblChild c
         ) c 
         ON p.OrderID = c.OrderID
    GROUP BY p.OrderID, p.Customer;
    

    【讨论】:

    • 非常感谢您!花了一点时间才弄明白,但最终还是到了那里,而且效果很好。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2019-03-09
    • 2014-12-07
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多