如何解决Oracle SQL查询为包含相同ID的行提取最大日期的数据
我有一张桌子,比如说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,'DD.MM.YY HH24:MI:SS')
and G = (select MAX(G) from Table1 where G = t1.G)
所需的输出是:
我在做什么错了?
解决方法
您可以使用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;
,
如果只需要一行,则可以按以下顺序进行订购和限制:
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
是数字,所以我删除了条件中文字值的单引号(如果该列是字符串数据类型,则可以将其改回来)
如果需要查找在Get列中具有最大日期值的所有那些行,则可以使用窗口函数density_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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。