Mysql 获取每个唯一ID的最大列值

Mysql 获取每个唯一ID的最大列值,mysql,sql,join,greatest-n-per-group,maxdate,Mysql,Sql,Join,Greatest N Per Group,Maxdate,我有两个表,一个是客户表和订单表 customers表包含每个客户的唯一ID。它包含1141个条目 orders表包含许多带有customerID和date的条目 我试图查询我的数据库,并从订单列表返回客户列表和max(date) SELECT * FROM customers INNER JOIN ( SELECT CustomerID, max(date) as date FROM orders GROUP BY CustomerID ) Sub1 ON custom

我有两个表,一个是
客户
表和
订单

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

orders
表包含许多带有
customerID
date
的条目

我试图查询我的数据库,并从订单列表返回客户列表和
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行。这是从哪里得到的额外信息?

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

问题在于存在联系

;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
对于给定的客户,有些客户每天下不止一个订单。因此,有时有些人可能会在他们的最长日期下不止一个订单

要解决此问题,您需要使用
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,但日期更早。如果您允许按时间顺序输入数据,例如追溯订单,则可能会发生这种情况。

MySQL不支持诸如
row_number()
+1之类的窗口功能。具体来说,在给定日期,即客户的最长日期,每个客户可能有多个订单。@BillKarwin Yes,但是我怎么能只返回一个呢?所以本质上,它从每个客户的max orderid中选择max date?它不选择日期,而是选择orderid。如果OrderID是按时间顺序分配的,那么它自然与每个客户的最大日期相对应。