Самая последняя запись в левом присоединении

Представьте, что у меня есть следующие 3 таблицы в SqlServer:

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

Клиент может иметь несколько адресов доставки и mulitple продуктов.

То, что я хотел бы сделать, это перечислить количество клиентов для каждого государства, где государство определяется последним адрес записи. Такие, как "Сколько клиентов в последний раз получили продукт в каждом государстве?". Поэтому меня не интересуют предыдущие адресные записи для Клиента, только самые последние (определяемые 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

Однако, как клиент может иметь несколько адресов будет клиент будет рассчитываться только в состоянии последней записи адреса?

П.С. Выше является чисто примером сценария, чтобы легко объяснить соединения я пытаюсь достичь и не отражает фактический дизайн системы.

Ответ на: "Самая последняя запись в левом присоединении"

Количество ответов:3

Вы также можете попробовать (если я помню мой синтаксис S'LServer правильно):

SELECT state, count(customer_id)
FROM (
    SELECT
        p.customer_id
        , (SELECT TOP 1 State FROM Address WHERE Address.CustomerID = p.CustomerID ORDER BY Address.ID DESC) state
    FROM Product p
    WHERE p.ProductID = 101)
GROUP BY state

Попробуйте:

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

Я не вижу, как вы можете сделать это без заказов и OrderDetails таблицы. Таблица заказов будет включать в себя CustomerID ShippingDate и ShipToAddressID, а OrderDetails будет иметь OrderID и ProductID. Затем вам понадобится вложенный запрос, чтобы определить самый последний заказ (и, следовательно, самый последний адрес), присоединиться к этому к данным заказа, чтобы получить продукты заказали, а затем фильтр на продукт, который вы заботитесь о.