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 BYFETCH

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 的行提取最大日期的数据的主要内容,如果未能解决你的问题,请参考以下文章

将 T-SQL 交叉应用转换为 Oracle

SQL 获取具有相同 id 的所有行的计数

SQL 聚合具有相同 id 的行,辅助列中的特定值

PHP SQL 查询不返回与 phpMyAdmin 中相同的行

Oracle SQL 选择不同的查询以返回特定的行数

选择 id 为偶数的行