SQL:根据最近的日期选择一个字段中的值是唯一的记录

Posted

技术标签:

【中文标题】SQL:根据最近的日期选择一个字段中的值是唯一的记录【英文标题】:SQL: Selecting record where values in one field are unique based off of most recent date 【发布时间】:2020-12-08 22:31:42 【问题描述】:

我正在尝试编写一条 SQL 语句来选择记录,以便每条记录都有一个唯一的 PartNo,并且我希望该记录基于最近的 ReceiveDate。当我问this问题时,我得到了答案:

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

但是,此答案假定对于每个 ReceiveDate,您不会有两次相同的 PartNo。在多条记录具有相同的 PartNo 和 ReceiveDate 的情况下,选择哪个并不重要,但我只想选择一个(PartNo 必须是唯一的)

例子:

PartNo | Vendor | Qty | ReceiveDate
 100   |  Bob   | 2   | 2020/07/30
 100   | Bob    | 3   | 2020/07/30

应该只返回这些记录之一。

我正在使用 Microsoft Access,它使用与 T-SQL 非常相似的 Jet SQL。

【问题讨论】:

你有任何唯一定义每一行的列吗? @GordonLinoff 没有。不幸的是,我也不能添加一个,这些数据来自我们的 ERP 系统,我无法编辑。以下是一些记录的示例:ibb.co/c37nRGv 。 .这使得这在 MS Access 中非常很棘手。 【参考方案1】:

手动设置标准聚合查询(功能区中的 sigma 图标),其中按部件号分组,日期字段设置为 MAX...

运行查询以检查它是否返回了您寻求的值...然后在设计视图中 - 选择 SQL 视图,这将为您提供 sql 语句...

【讨论】:

【参考方案2】:

使用NOT EXISTS:

select distinct t.*
from tablename as t
where not exists (
  select 1 from tablename
  where partno = t.partno
  and (
    receivedate > t.receivedate
    or (receivedate = t.receivedate and qty > t.qty)
    or (receivedate = t.receivedate and qty = t.qty and vendor > t.vendor)
  )
)

【讨论】:

以上是关于SQL:根据最近的日期选择一个字段中的值是唯一的记录的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中对星期几进行排序

如果另一列中的值是唯一的,那么如何在SQL中放置一个显示1的列,如果它是重复的则为0?

MYSQL如何根据变量的值来选择字段进行查询

唯一约束

SQL - 帮助根据比例和唯一 ID 选择随机日期

SQL语句对某字段去重?