【问题标题】:SQL query in ORACLE - select most recent dateORACLE 中的 SQL 查询 - 选择最近的日期
【发布时间】: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 作为标识符。我建议你尽快改变它,如果你失去它们,这是一笔大而昂贵的交易。而且它的效率较低,因为您需要使用字符串而不是数字作为标识符。通常不是最好的主意。

标签: sql oracle oracle-sqldeveloper analytic-functions


【解决方案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。否则,你需要告诉我们你想用什么逻辑来打破平局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2023-03-31
    • 2018-03-20
    • 2014-09-02
    相关资源
    最近更新 更多