sql - 左连接中的最新记录

标签 sql sql-server sql-server-2005

假设我在 SqlServer 中有以下 3 个表:

Customer (CustomerID, FirstName, LastName)
Address (AddressID, CustomerID, Line1, City, State)
Product (ProductID, CustomerID, Description)

一个客户可以有多个送货地址和多种产品。

我想做的是列出每个州的客户数量,其中州由最新的地址记录确定。例如“每个州有多少客户最后收到了产品?”。因此,我对客户以前的任何地址记录都不感兴趣,只对最近的地址记录(由 AddressID 确定)感兴趣。

State | Number of Customers
--------------------------
CA    | 32
GA    | 12
TX    | 0
OH    | 18

我通常会做这样的事情:

SELECT a.State, count(c.CustomerID)
FROM Product p
INNER JOIN Customer c ON c.CustomerID = p.CustomerID
LEFT JOIN Address a ON a.CustomerID = c.CustomerID
WHERE p.ProductID = 101
GROUP BY a.State

但是,由于客户可能有多个地址,该客户是否只会计入最新地址记录的州?

附注以上纯粹是一个示例场景,用于轻松解释我试图实现的连接,并不反射(reflect)实际的系统设计。

最佳答案

试试这个:

SELECT a.State, count(c.CustomerID)
FROM Product p
INNER JOIN Customer c ON c.CustomerID = p.CustomerID
LEFT JOIN Address a ON a.CustomerID = c.CustomerID 
      AND a.AddressID = 
        (
           SELECT MAX(AddressID) 
           FROM Address z 
           WHERE z.CustomerID = a.CustomerID
        )
WHERE p.ProductID = 101
GROUP BY a.State

关于sql - 左连接中的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/725153/

相关文章:

java - Oracle 不使用基于函数的索引来进行带有绑定(bind)变量的 regex_replace

c# - 查询重复日期

sql - 从服务器删除所有数据库

sql - “Syntax error at or near ” 202382_ “at character 15 ”执行以下查询时

C++ - 通过网络发送 "Email Attachments"

asp.net - 设置默认的 AspNetSqlProvider 以指向远程数据库

sql - 使用查找矩阵中最接近的值更新表

sql-server-2005 - 如何创建 SQL Server 2005 数据库的实时副本?

sql - 如何返回重复值的空单元格并仅保留不同的单元格?

mysql - 如何在 SQL 中转换 PromQL 查询?