Oracle SQL 查询为包含相同 ID 的行提取最大日期的数据
Posted
技术标签:
【中文标题】Oracle SQL 查询为包含相同 ID 的行提取最大日期的数据【英文标题】:Oracle SQL query to extract data for a maximum date for rows contianing the same ID 【发布时间】:2020-12-08 14:55:00 【问题描述】:我有一张桌子,比如 Table1:
而且,我正在尝试使用以下条件提取数据:
-
选择 A 列中的所有条目,即 2 和 5,
B 列中为 100 的所有条目
C 列中合同 ID 为 15 的所有数据
例如 D 列中小于 31.02.2016 的所有日期
最后,列 G 中具有最大值的行
如果我使用以下代码(除了在 G 列中查找最大日期),它可以正常工作:
Select * from Table1
where
A in (2 , 5)
and B = 100
and C = '15'
and D <= TO_DATE ('31.01.16', 'DD.MM.YY HH24:MI:SS')
并给我以下结果:
现在,我想在 G 列中找到所有那些具有最大日期值的行。如果我在这种情况下使用以下内容来查找与 G 中的最大日期相对应的行,则查询运行并且我得到一个空仅包含列名的表:
Select * from Table1 t1
where
A in (2 , 5)
and B = 100
and C = '15'
and D <= TO_DATE ('31.01.16', 'DD.MM.YY HH24:MI:SS')
and G = (select MAX(G) from Table1 where G = t1.G)
想要的输出是:
我做错了什么?
【问题讨论】:
你能粘贴你的样本数据而不是图片吗 雷,请检查答案 @Atif:我试过了,我知道我无法在此处加载/粘贴文件。我发现这个链接支持它:meta.***.com/questions/314547/… 【参考方案1】:您可以使用ORDER BY
和FETCH
:
select *
from Table1
where A in (2 ,5) and
B = 100 and
C = '15' and
D <= date '2016-01-31'
order by g desc
fetch first 1 row only;
请注意,我还简化了日期常量的语法。
如果您想要 所有 行以防出现平局,请使用:
fetch first 1 row with ties;
【讨论】:
【参考方案2】:如果你只想要一排,你可以订购和限制:
Select *
from Table1
where
A in (2 , 5)
and B = 100
and C = 15
and D <= date '2016-01-31'
order by d desc
fetch first 1 row only
如果您想允许排名靠前,那么您可以改用fetch first 1 row with ties
。
注意事项
我使用文字日期而不是to_date()
:这样写起来更简单,效率更高(请注意,您的原始格式规范是错误的,因为字符串没有时间部分)
看起来C
列是数字,所以我删除了条件中文字值周围的单引号(如果该列是字符串数据类型,您可以将其改回)
【讨论】:
感谢您的回答和注释。【参考方案3】:如果您需要找到所有那些在 Get 列中具有最大日期值的行,那么您可以使用窗口函数 dense_rank()。具有相同排名标准值的行将获得相同的排名值:
--get all rows with num=1
Select * from
(
Select *, dense_rank() over (order by G desc) num
where
A in (2 , 5)
and B = 100
and C = '15'
and D <= TO_DATE ('31.01.16', 'DD.MM.YY HH24:MI:SS')
) X
Where num=1
【讨论】:
以上是关于Oracle SQL 查询为包含相同 ID 的行提取最大日期的数据的主要内容,如果未能解决你的问题,请参考以下文章