1

我有两张桌子,一张customers桌子orders

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

orders表包含许多带有 acustomerID和 a 的条目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 行。这是从哪里获得的额外收益?

4

3 回答 3

1

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

于 2017-01-25T18:19:31.567 回答
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
于 2017-01-25T18:36:36.617 回答
0

问题是有联系。

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

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

于 2017-01-26T15:38:24.557 回答