【问题标题】:How to select records without duplicates with the latest record in one field in SQL?如何在SQL中选择一个字段中最新记录且不重复的记录?
【发布时间】:2018-12-03 01:33:06
【问题描述】:

我有一些来自 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;

这是一个

.

如您所见,我使用 ID 字段来识别每个发布商/供应商组合的最新条目;但是,我只想查看每个发布者的最新供应商。

例如,应为 Adob​​e Systems, Inc. 返回的行是:

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

我想不通。你能帮忙吗?

【问题讨论】:

    标签: sql ms-access duplicates distinct


    【解决方案1】:

    您可以在 WHERE 子句中使用 EXISTS 和子查询,仅选择最高 ID:

    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)
    

    【讨论】:

    • 当我运行它时,它仍然显示重复的供应商,但已经消除了所有空白供应商。这是 Adob​​e 示例的结果截图:imgur.com/a/e0oKN4f
    • Eh.. 我以为你是这样想的。删除 AND sd.Vendor = [Software Details].Vendor 以删除这些结果
    【解决方案2】:

    你可以试试Ranking Function,可以得到这样的预期结果:

    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
    

    【讨论】:

    • 排名功能在 MS Access 中不可用。您的回答无效。
    【解决方案3】:

    首先,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
                  );
    

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2016-02-11
      • 2017-01-22
      • 1970-01-01
      相关资源
      最近更新 更多