Как присоединиться к подзапросу, который возвращает один результат? - PullRequest
0 голосов
/ 25 мая 2018

Мне нужна помощь с подзапросом. Просто, чтобы упростить задачу

У меня есть таблица клиентов (есть только уникальные клиенты)

Cust ID, Cust Name

У меня есть таблица продаж (естьнесколько записей для клиентов)

SaleID, CustID, DatePurchase, Amount

Я хочу вернуть всех клиентов, но показать только их последние покупки

John Smith     02/05/2018
Jane Smith     02/10/2018

Я хочу, чтобы кто-то использовал объединение ....

Ответы [ 5 ]

0 голосов
/ 25 мая 2018

Если вы просто хотите получить последнюю дату покупки, используйте JOIN и GROUP BY:

SELECT c.CustName, MAX(s.DatePurchase)
FROM customer c INNER JOIN
     sales s
     ON c.custid = s.custid
GROUP BY c.custid, c.custname;
0 голосов
/ 25 мая 2018

Вы также можете использовать простой подзапрос, как показано ниже

SELECT c.Cust_Name,
    s.DatePurchase
FROM customer c
INNER JOIN sales s
INNER JOIN (SELECT Cust_ID, 
            MAX(DatePurchase) dpur 
            FROM sales GROUP BY Cust_ID) s1 ON s1.Cust_ID = s.Cust_ID
    AND s1.dpur = s.DatePurchase
0 голосов
/ 25 мая 2018

Я бы использовал ROW_NUMBER здесь:

SELECT CustID, CustName, SaleID, DatePurchase, Amount
FROM
(
    SELECT c.*, s.SaleID, s.DatePurchase, s.Amount,
        ROW_NUMBER() OVER (PARTITION BY c.CustID ORDER BY s.DatePurchase DESC) rn
    FROM customer c
    LEFT JOIN sales s
        ON c.CustID = s.CustID
) t
WHERE t.rn = 1;

Обратите внимание, что те клиенты, у которых вообще нет записей о продажах, сообщат NULL об идентификаторе продажи, дате покупки и сумме.Мы могли бы заменить их заполнителями, используя COALESCE, если необходимо.

0 голосов
/ 25 мая 2018

Помимо других ответов, существует также возможность использовать конструкцию dense_rank.

В вашем случае:

select c.CustID, max(s.DatePurchase) keep (dense_rank FIRST order by s.DatePurchase desc) 
from customers c
LEFT JOIN sales s on s.CustID = c.CustID
group by c.CustID;
0 голосов
/ 25 мая 2018

Вы можете использовать OUTER APPLY (Oracle 12c):

SELECT *
FROM Cust c
OUTER APPLY (SELECT *
             FROM Sales s
             WHERE c.cust_id = s.sales_id
             ORDER BY s.DatePurchase DESC
             FETCH FIRST 1 ROW ONLY) sub;

В качестве альтернативы:

WITH cte AS (
  SELECT c.*,s.Amount, s.DatePurchase, s.SaleId
     ROW_NUMBER() OVER(PARTITION BY c.Cust_id ORDER BY s.DatePurchase DESC) AS rn
  FROM Cust c
  LEFT JOIN Sales s
    ON c.Cust_id = s.Cust_id
)
SELECT *
FROM cte
WHERE rn = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...