ORACLE 中的 SQL 查询 - 选择最近的日期

Posted

技术标签:

【中文标题】ORACLE 中的 SQL 查询 - 选择最近的日期【英文标题】:SQL query in ORACLE - select most recent date 【发布时间】:2014-03-31 20:10:02 【问题描述】:

我是 SQL 查询领域的新手。 我需要消除重复的 Staff # 并仅检索突出显示的行。 非常感谢任何帮助。

Staff#      Pay_DT      Due_DT      loan_flag   housing 
------------------------------------------------------------------------
123-45-6789     14-Feb-14   3-Jan-14    Y       null 
123-45-6789     14-Feb-14   3-Jan-14    Y       Annual 
123-45-6789     14-Feb-14   13-Jan-14   Y       null 
**123-45-6789   14-Feb-14   13-Jan-14   Y       Annual** 
123-45-6789     null        null        Y       null 
123-45-6789     null        null        Y       Annual

【问题讨论】:

为什么是那一行?您的主题谈论“最近的日期”。你不说那是哪个日期。有 4 行具有相同的最大值 pay_dt。有两行具有相同的最大值 pay_dtdue_dt。你为什么选择一个而不是另一个? 您只想返回那一行? 这是历史数据。我需要知道将住房设置为年度并付款的 Pay DT。感谢您的及时回复。 @咖啡 - 是的。该行是期望的结果。 嘿,旁注。您似乎在数据库中使用 SSN 作为标识符。我建议你尽快改变它,如果你失去它们,这是一笔大而昂贵的交易。而且它的效率较低,因为您需要使用字符串而不是数字作为标识符。通常不是最好的主意。 【参考方案1】:

也许你想要

SELECT *
  FROM (SELECT a.*,
               rank() over (partition by staff# order by pay_dt desc) rnk
          FROM table_name a
         WHERE housing = 'Annual')
 WHERE rnk = 1

交替

SELECT *
  FROM (SELECT a.*,
               max(pay_dt) over (partition by staff#) max_pay_dt
          FROM table_name a
         WHERE housing = 'Annual')
 WHERE pay_dt = max_pay_dt

如果您可以有关联(两行具有相同的 pay_dt,其中 housing 列的值 Annual 对应特定的 Staff# 值,则这两个查询都将返回具有该条件的所有行. 如果你想任意打破平局,你可以使用row_number而不是rank。否则,你需要告诉我们你想用什么逻辑来打破平局。

【讨论】:

以上是关于ORACLE 中的 SQL 查询 - 选择最近的日期的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle中选择具有最近日期和时间的记录[重复]

Oracle SQL 中的插入选择查询缺少表达式错误

oracle sql动态查询以选择游标中的列

从 Oracle 9i 中的嵌套查询中选择

如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果

从另一个表中选择一个表的否定以及oracle的主表sql查询中的数据