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

时间:2017-01-25 18:14:39

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

我有两个表,一个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行。从哪里获得额外收益?

3 个答案:

答案 0 :(得分:1)

我认为这是因为ORDERS表多次包含相同的customerID,因此当您使用CUSTOMERS加入表时,每个CUSTOMER.id都匹配多行ORDERS。

答案 1 :(得分:0)

;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

答案 2 :(得分:0)

问题在于存在联系。

对于特定客户,某些地方每天有多个订单。因此,有可能偶尔有些人可能会在最大日期的日期下达多个订单。

要解决此问题,您需要使用MAX()或某些在Orders表中始终唯一的列(或在给定日期内至少是唯一的)。如果您可以依赖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随着日期的增加而增加。也就是说,您永远不会拥有更大的自动识别订单但是更早的订单。如果您允许按时间顺序输入数据,例如,可能会发生这种情况,例如回溯订单。