【问题标题】:Get the max column value for each unique ID获取每个唯一 ID 的最大列值
【发布时间】:2017-06-11 01:17:34
【问题描述】:

我有两张桌子,一张customersorders 桌子。

customers 表包含每个客户的唯一 ID。它包含 1141 个条目。

orders 表包含许多带有customerIDdate 的条目。

我正在尝试查询我的数据库并从订单列表中返回客户列表和max(date)

SELECT *
FROM customers
INNER JOIN
(
    SELECT CustomerID, max(date) as date
    FROM orders
    GROUP BY CustomerID
) Sub1
ON customers.id = Sub1.CustomerID
INNER JOIN orders
ON orders.CustomerID = Sub1.CustomerID
AND orders.date = Sub1.Date

但是,此查询返回 1726 行而不是 1141 行。这是从哪里获得的额外收益?

【问题讨论】:

    标签: mysql sql join greatest-n-per-group maxdate


    【解决方案1】:

    我认为这是因为 ORDERS 表多次包含相同的 customerID,因此当您将表与 CUSTOMERS 连接时,每个 CUSTOMER.id 匹配多行 ORDERS。

    【讨论】:

    • +1 具体来说,每个客户在给定日期(即该客户的最大日期)可能有多个订单。
    • @BillKarwin 是的,但是我怎样才能只返回一个?
    【解决方案2】:
    ;with cte as
    (
      select CustomerID, orderdate
          , rn = row_number() over (partition by customerID order by orderdate desc)
    from orders
    )
    
    select c.*, cte.orderdate
    from customer c
     join cte on cte.customerID = c.customerid 
    where rn =1 -- This will limit to latest orderdate
    

    【讨论】:

    • MySQL 不支持像row_number() 这样的窗口函数。
    【解决方案3】:

    问题是有关系。

    对于给定的客户,有些人每天会下超过一个订单。因此,有时有些人可能会在他们最大日期的日期下超过一个订单。

    要解决此问题,您需要使用MAX() 或某个在订单表中始终唯一(或至少在给定日期内唯一)的列。如果您可以依赖 Orders 表中的自动递增主键,这很容易:

    SELECT *
    FROM customers
    INNER JOIN
    (
        SELECT CustomerID, max(orderid) as orderid as date
        FROM orders
        GROUP BY CustomerID
    ) Sub1
    ON customers.id = Sub1.CustomerID
    INNER JOIN orders
    ON orders.CustomerID = Sub1.CustomerID
    AND orders.orderid = Sub1.orderid
    

    这假设 orderid 随着日期的增加而同步增加。也就是说,您永远不会收到具有更大 auto-inc id 但更早日期的订单。如果您允许按时间顺序输入数据,则可能会发生这种情况,例如回溯订单。

    【讨论】:

    • 所以本质上,这会从每个客户的最大 orderid 中选择最大日期?
    • 它不选择日期,它选择 orderids。如果 orderids 是按时间顺序分配的,那么它自然对应于每个客户的最大日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多