Я пытаюсь получить список всех клиентов, за которые у моей компании не было никаких заданий за последний год.
SELECT MAX(assignment_date), full_name
FROM assignments
CROSS JOIN customers
WHERE assignments.customer_id = customers.id
AND assignment_date < '2017-01-01' -- Dynamic value from backend
GROUP BY full_name
ORDER BY assignment_date DESC
Похоже, что это работает не так, как предполагалось, поскольку оно возвращает только некоторых клиентов, которых у нас были заданы в течение этого периода времени. Как я могу реализовать такую функцию?
Попробуйте этот код:
SELECT MAX(assignment_date), full_name
FROM customers
where id not in (SELECT id FROM customers inner join assigments on customers.id = assignments.customer_id WHERE assignment_date > '2017-01-01' )
Это вернет всех клиентов в вашу базу данных и удалит всех из них, у кого были настройки в прошлом году. В результате вы должны получить всех клиентов без указаний до "2017-01-01"
assignment_date
- это столбец в assignments
поэтому ваш запрос нуждается в некоторой корректировке.
Я хотел бы предложить left join
, group by
и having
:
SELECT MAX(assignment_date), full_name
FROM customers c LEFT JOIN
assignments a
ON a.customer_id = c.id
GROUP BY c.full_name
HAVING MAX(a.assignment_date) < '2017-01-01' OR
MAX(a.assignment_date) IS NULL
ORDER BY MAX(assignment_date) DESC;
Кажется, вы хотите показать всем клиентам свою последнюю дату назначения, но вы хотите ограничить этот список клиентами, у которых не было назначений с 2017-01-01. Это означает, что даты, которые будут отображаться, будут нулевыми для тех клиентов, у которых никогда не было заданий, и даты до 2017-01-01 для остальных.
Таким образом, внешние соединения присоединяются к последним датам для клиентов и сохраняют только те строки, где эта дата до 2017-01-01, или null:
select c.full_name, a.max_date
from customers c
left join
(
select customer_id, max(assignment_date) as max_date
from assignments
group by customer_id
) a on a.customer_id = c.customer_id
where a.max_date < date '2017-01-01'
or a.max_date is null
order by a.max_date desc;
left присоединяют клиентов к назначениям, где assignments.customer_id IS NULL и assign_date больше, чем '2017-01-01', т.е.
SELECT MAX(assignment_date), full_name
FROM assignments
WHERE assignments.customer_id IN
(SELECT customers.id
FROM customers
LEFT JOIN assignments ON assignments.customer_id = customers.id
WHERE assignments.customer_id IS NULL
AND assignment_date > '2017-01-01')
GROUP BY full_name
ORDER BY assignment_date DESC