SQL: выбор нескольких полей с одним уникальным полем на основе самой последней даты

#sql #ms-access

#sql #ms-access

Вопрос:

Я пытаюсь написать инструкцию SQL для выбора уникального номера детали на основе самой последней даты. Если у меня есть только два поля PartNo и ReceiveDate, я мог бы сделать:

 "SELECT PartNo, Max(ReceiveDate) FROM Table GROUP BY PartNo;"
  

и это вернет уникальное PartNo и самую последнюю дату.

Проблема в том, что я также хочу включить поля VendorName и Qty (но я просто хочу, чтобы PartNo было уникальным). Я пытался:

 "SELECT PartNo, VendorName, Qty, Max(ReceiveDate) FROM Table GROUP BY PartNo;"
  

и

 "SELECT PartNo, VendorName, Qty, Max(ReceiveDate) FROM Table GROUP BY PartNo, VendorName, Qty;"
  

Я понимаю, почему эти два оператора SELECT неверны, первый не выполняется, поскольку VendorName и Qty отсутствуют в предложении GROUP BY или части агрегатной функции, а во втором выбирается уникальная запись на основе PartNo И VendorName И Qty, а не только PartNo.

Если бы кто-нибудь мог помочь мне написать правильный оператор SQL, это было бы необходимо оценить. Я использую Microsoft Access, который использует Jet SQL, который очень похож на T-SQL.

Ответ №1:

Я бы предложил связанный подзапрос:

 SELECT t.*
FROM Table as t
WHERE t.ReceiveDate = (SELECT MAX(t2.ReceiveDate)
                       FROM Table as t2
                       WHERE t2.PartNo = t.PartNo
                      );
  

В частности, это может использовать преимущества индекса на (PartNo, ReceiveDate) .

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

1. Это приближает меня! Единственная проблема заключается в том, что даты записываются по дням, и мы иногда получаем одно и то же PartNo, полученное в тот же день. Я попытался добавить DISTINCT перед t . * однако я все еще получаю повторяющиеся PARTNOS, поскольку количество может отличаться. Вы знаете, как я мог бы изменить это, чтобы PartNos был уникальным?

2. @person1234568475 . . . Я бы посоветовал вам задать новый вопрос с соответствующими примерами данных, желаемыми результатами и объяснением. Это отвечает на вопрос, который вы задали здесь: «Я пытаюсь написать инструкцию SQL для выбора уникального номера детали на основе самой последней даты». на основе очень разумного предположения, что дата уникальна. Если вы измените этот вопрос, вы сделаете недействительными ответы на него.

Ответ №2:

Если вы имеете в виду, что вам все равно, из какой строки берутся Vendorname и Qty (для каждого партнера), то вы можете просто создать для них некоторую агрегатную функцию:

 SELECT PartNo, 
  max(VendorName) as VendorName, 
  max(Qty) as Qty, 
  Max(ReceiveDate) as ReceiveDate 
FROM [Table] 
GROUP BY PartNo;
  

Вероятно, лучшим подходом было бы получить эти имя поставщика и кол-во из строки с последней датой получения (я предполагаю, что группировка возвращает 1 дату на партнера):

 select t.PartNo, t.VendorName, t.Qty, tmp.LastDate as ReceiveDate
from (SELECT PartNo, Max(ReceiveDate) as lastDate 
      FROM [Table] 
      GROUP BY PartNo) tmp
inner join [Table] t on t.PartNo = tmp.PartNo
where t.ReceiveDate = tmp.lastDate; 
  

И я предполагаю, что никто на самом деле не назвал бы таблицу [Таблица].

Ответ №3:

Попробуйте использовать запрос перекрестной таблицы:

 SELECT DISTINCT X.PartNo,X.MaxDate,Y.VendorName,Y.Qty  FROM
(SELECT PartNo, Max(ReceiveDate)MaxDate FROM Table GROUP BY PartNo)X,
(SELECT PartNo, VendorName, Qty From Table)Y
WHERE X.PartNo=Y.PartNo