在 Oracle SQL 查询中选择最新的

Posted

技术标签:

【中文标题】在 Oracle SQL 查询中选择最新的【英文标题】:SELECT most recent in Oracle SQL Query 【发布时间】:2018-02-15 13:24:49 【问题描述】:

早上好,

我正在尝试完成一些超出我专业水平的事情。感谢这个网站上的一些人,我的 Oracle-SQL 技能大大提高了,但我想尝试一些新的东西。

我有四个表 - 一个采购订单表、一个产品供应商表、一个缺陷表和一个零件表。

我的公司有三个“部门”(拆除 (A)、混凝土 (B) 和建筑 (C))。我想查看针对特定部门购买的零件的所有缺陷。我在下面有一个工作查询。我的问题是,有时我们有多个 PO 用于同一部分 - 有时我们会出于任何原因更换供应商(即在物流团队中,而不是我;))所以我最终会得到如下所示的东西:

请注意,有两行,不同的供应商,但其他一切都相同。我只想要最近购买的部分。我正在过滤一个采购订单日期。这是查询:

WITH

    PartNums AS -- Grabs me all of the stuff we "bought", and its vendor, in the construction division since Jan 1 2018
        (
            SELECT 
                PO_ITEM AS "PART_NUM",
                VEND_NUM,
                VEND_NM,
                PODiv AS "DIVISION_CD"
            FROM
                tblPurchases
                    INNER JOIN tblVendors ON tblPurchased.VEND_NUM = tblVendors.VEND_NUM
            WHERE
                PODate >= '01-Jan-2018'
                AND
                PODiv = 'C'
        ),

    Defects AS -- Grabs me the listed defects against their stuff
        (
            SELECT 
                PartNums.*,
                DEFECT_NUM,
                DEFECT_CAT
            FROM
                PartNums
                    INNER JOIN tblDefects ON PartNums.PART_NUM = tblDefects.DEFECTIVE_PART_NUM

        ),

    Names AS -- Grabs me the name of the part we are buying
        (
            SELECT
                Defects.*,
                PART_NM
            FROM
                Defects
                    INNER JOIN tblParts ON Defects.PART_NUM = tblParts.PART_NUM
        )

    SELECT
        VEND_NUM,
        VEND_NM,
        PART_NUM,
        PART_NM,
        DEFECT_NUM,
        DEFECT_CAT,
        DIVISION_CD

    FROM Names

基本上,我想做的是,如果有多个供应商提供单个零件编号,只需获取最新的...有人知道该怎么做吗?我尝试了 SELECT DISTINCT 但它没有任何区别...... :(

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

这是一个格式化的评论。要获取最新的内容,您需要在某处使用子查询。

where yourDate = (subquery to find more recent date)

from yourTable join (
subquery to get most recent date
plus a recordId
) temp on yourTable.recordID = temp.recordID
and yourTable.yourDate = temp.mostRecentDate

细节由你决定。

【讨论】:

嗨@Dan Bracuk,非常感谢您的回复。我想我的问题是我不知道如何找到最近的日期?我尝试了 ORDER BY 和 MAX,但我只得到一个结果(总体上是最新的,而不仅仅是每个不同零件编号的最新)。很抱歉造成混乱,但感谢您的帮助! 一次做一件事。从一个查询开始,该查询可为您获取每个部分的最新日期。然后将其转换为子查询并与真实表一起使用。 我很抱歉这么密集,但这是我不明白的——我想我不知道如何找到“每个部分的最近日期”。我尝试在日期使用 MAX(),但后来我只得到一个结果,而不是每个部分都有一个结果。 您的工作是否在您的 select 和 group by 子句中包含了部件标识符?【参考方案2】:

使用 rank() 之类的分析函数对组内的日期进行排序。

Rank() over (partition by grouping_column order by ordering_column desc) as my_rank

然后,在外部查询中只获取排名靠前的值

其中 my_rank = 1

对不起,这不是格式化的,但第一次通过我的手机回答。

【讨论】:

嗨@unleashed,非常感谢您的建议。这对每个“零件号”都可行吗? 我的问题是我为同一个零件获得了多个供应商(来自采购订单)。我希望只与最近的供应商一起获得一个单独的部分。 堆栈溢出与手机?好吧,你不是很喜欢惩罚吗? 你可以使用 rank() over (partition by partnum, partname, defectnum,defectcategory, partition order by purchase_order_Date desc) rank 并使用 rank = 1 的外部查询

以上是关于在 Oracle SQL 查询中选择最新的的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle中选择具有最近日期和时间的记录[重复]

选择一个Id每天的最新记录 - Oracle pl sql

从 Oracle 9i 中的嵌套查询中选择

构建一些动态查询选择并立即在 Oracle PL/SQL 中显示其输出

我可以在 Oracle 中删除没有子选择的最新记录吗?

从 oracle 中为每个组选择最新行