我有两个表,一个customers
和orders
表。
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行。从哪里获得额外收益?
答案 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随着日期的增加而增加。也就是说,您永远不会拥有更大的自动识别订单但是更早的订单。如果您允许按时间顺序输入数据,例如,可能会发生这种情况,例如回溯订单。