SQL — где МИНИМАЛЬНАЯ дата ровно 7 дней назад

#sql #oracle #where-clause #min

#sql #Oracle #where-предложение #мин

Вопрос:

Мне нужно выбрать только те строки, где МИНИМАЛЬНАЯ дата 7 дней назад. У меня есть клиенты со счетами-фактурами, у счетов-фактур есть сроки оплаты. Я могу выбрать минимальную дату оплаты этих счетов для каждого клиента. Теперь я застрял, поскольку не могу выбрать только клиентов, у которых просрочено ровно 7 дней с их самым старым счетом.

Это то, что у меня есть:

 select
 customerID,
 MIN(dueDate) as min_due_date
 from invoices
 where (invoiceStatus NOT IN ('PaidPosted','Cancelled'))
 and (entity = 'HQ')
 group by (customerID)
  

Я попытался добавить:

 and min_due_date = dateadd(day, -7, SYSDATE())
  

Это не работает.
Что я делаю не так?

Спасибо.

Комментарии:

1. Я просматривал сайт уже более часа, и мне не повезло найти похожий случай.

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

3. Является ли бренд базы данных = MySQL?

Ответ №1:

Используйте having предложение для фильтрации минимальной даты:

 select customerID, min(dueDate) as min_due_date
from invoices
where invoiceStatus not in ('PaidPosted', 'Cancelled') and
      entity = 'HQ'
group by customerID
having min(duedate) = current_date - interval '7 day';
  

Обратите внимание, что функции даты сильно зависят от базы данных. Приведенный выше стандартный SQL, но точный синтаксис зависит от используемой вами базы данных.

Ответ №2:

Спасибо, Гордон, ты наставил меня на правильный путь! Это то, что в конечном итоге сделало свое дело:

 select customerID, min(dueDate) as min_due_date
from invoices
where invoiceStatus not in ('PaidPosted', 'Cancelled') and
      entity = 'HQ'
having MIN(dueDate) = trunc(sysdate) -7
group by customerID
  

Комментарии:

1. В MySQL нет trunc() функции. Установите правильный тег в вашем вопросе.