在 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 查询中选择最新的的主要内容,如果未能解决你的问题,请参考以下文章