在Oracle SQL Query中选择最新的

时间:2018-02-15 13:24:49

标签: sql oracle select

早上好,

我正在努力完成比我的专业水平更高的事情。感谢网站上的一些人,我的Oracle-SQL技能已经大大增加,但我想采取新的措施。

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

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

enter image description here

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

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,但没有区别...... :(

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

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

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

细节取决于你。

答案 1 :(得分:0)

使用rank()之类的分析函数来排序组中的日期。

Rank()结束(按order_column desc分组grouping_column顺序)为my_rank

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

my_rank = 1

抱歉,这格式化,但第一次通过我的手机回答。