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

У меня есть некоторые результаты запроса Microsoft Access в трех столбцах: Publisher, Vendor и ID.

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

Вот как далеко я продвинулась:

SELECT Suppliers.[Supplier Name] AS Publisher, [Software Details].Vendor, Max([Software Details].ID) AS MaxOfID
FROM Suppliers RIGHT JOIN
     [Software Details]
     ON Suppliers.ID = [Software Details].Publisher
GROUP BY Suppliers.[Supplier Name], [Software Details].Vendor;

Вот вам

sample of results.

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

Например, строка, которая должна быть возвращена для Adobe Systems, Inc.:

Publisher                 Vendor      MaxOfID
 Adobe Systems, Inc.       CDW-G       1357

Я не могу понять это. Вы можете помочь?

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Вы можете использовать EXISTS в предложении WHERE только для подзапроса, чтобы выбрать только самые высокие идентификаторы:

SELECT Suppliers.[Supplier Name] AS Publisher,
       [Software Details].Vendor,
       [Software Details].ID AS MaxOfID
FROM Suppliers
RIGHT JOIN [Software Details] ON Suppliers.ID = [Software Details].Publisher
WHERE EXISTS
    (SELECT 1
     FROM Suppliers suppl
     RIGHT JOIN [Software Details] sd ON suppl.ID = sd.Publisher
     WHERE suppl.[Supplier Name] = Suppliers.[Supplier Name]
       AND sd.Vendor = [Software Details].Vendor
     HAVING Max(sd.ID) = [Software Details].ID)
0 голосов
/ 24 июня 2018

Во-первых, RIGHT JOIN здесь не кажется подходящим.Используйте LEFT JOIN.Кроме того, псевдонимы таблиц облегчают написание и чтение запроса.

Затем вы можете использовать коррелированный запрос, чтобы получить то, что вы хотите:

SELECT s.[Supplier Name] AS Publisher, sd.Vendor, sd.ID AS MaxOfID
FROM Suppliers as s LEFT JOIN
     [Software Details] as sd
     ON s.ID = sd.Publisher
WHERE sd.ID = (SELECT MAX(sd2.ID)
               FROM [Software Details] as sd
               WHERE sd2.Publisher = sd.Publisher
              );
0 голосов
/ 24 июня 2018

Вы можете попробовать функцию ранжирования и получить ожидаемый результат, например:

select * from (SELECT Suppliers.ID SuppliersID,[Software Details].ID 
[SoftwareDetailsID],
Suppliers.[Supplier Name],[Software Details].Vendor Vendor, ROW_NUMBER() over(partition 
by Suppliers.[Supplier Name] order by [Software Details].ID desc) as row
FROM Suppliers RIGHT JOIN [Software Details] ON Suppliers.ID = [Software 
Details].PublisherID
) A where row=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...