SQL находит наибольшую дату во всех записях с датой старше x

0

Я пытаюсь получить список всех клиентов, за которые у моей компании не было никаких заданий за последний год.

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

Похоже, что это работает не так, как предполагалось, поскольку оно возвращает только некоторых клиентов, которых у нас были заданы в течение этого периода времени. Как я могу реализовать такую функцию?

  • 0
    Разве это не должно быть> '2017-01-01'?
  • 0
    @verhie Нет, это вернет всех клиентов, у которых были назначения после '2017-01-01'
Показать ещё 1 комментарий
Теги:
date

4 ответа

1
Лучший ответ

Попробуйте этот код:

  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"

  • 1
    Хорошая идея, но вероятно, assignment_date - это столбец в assignments поэтому ваш запрос нуждается в некоторой корректировке.
  • 0
    Спасибо, работал как шарм.
0

Я хотел бы предложить 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;
0

Кажется, вы хотите показать всем клиентам свою последнюю дату назначения, но вы хотите ограничить этот список клиентами, у которых не было назначений с 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;
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню