【问题标题】:Group records by last 6 weeks, find most recent record based on date in oracle按过去 6 周分组记录,在 oracle 中根据日期查找最近的记录
【发布时间】:2020-04-07 01:32:03
【问题描述】:

我需要帮助来创建一个 sql 查询,以在基于日期降序排序后获取最近 6 周的时间范围内的最新序列记录。 我能够做到这一点一个月没有任何问题。但是在前六周内我无法想出一种方法来做到这一点。我读到可以使用前一行和当前行之间的范围来实现这一点,但我没有成功。

这是一个示例数据:

来源:20 年 2 月 21 日至 20 年 4 月 3 日之间的随机数据(从当天算起的前六周)

Serial  Repair_dt
1       3-Apr-20
1       12-Mar-20
2       12-Mar-20
3       12-Mar-20
4       28-Feb-20
4       1-Mar-20
4       2-Apr-20
4       3-Apr-20
5       23-Feb-20
5       19-Mar-20
6       1-Mar-20

排名以查找基于日期的最近记录,按序列分组:

Serial  Repair_dt   rank
1       3-Apr-20    1
1       12-Mar-20   2
2       12-Mar-20   1
3       12-Mar-20   1
4       2-Apr-20    1
4       2-Apr-20    2
4       1-Mar-20    3
4       28-Feb-20   4
5       19-Mar-20   1
5       23-Feb-20   2
6       1-Mar-20    1

最终输出:

Serial  Repair_dt   rank
1       3-Apr-20    1
2       12-Mar-20   1
3       12-Mar-20   1
4       2-Apr-20    1
5       19-Mar-20   1
6       1-Mar-20    1

感谢您的帮助。

谢谢。 卡夫

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    你真的不需要这个排名。聚合适用于您描述的数据:

    select serial, max(repair_dt) as repair_dt
    from t
    where repair_dt > sysdate - interval '42' day
    group by serial;
    

    如果你想要整行,那么:

    select t.*
    from t
    where t.repair_dt = (select max(t2.repair_dt)
                         from t t2
                         where t2.serial = t.serial and
                               t2.repair_dt > sysdate - interval '42' day
                        );
    

    或者:

    select t.*
    from (select t.*,
                 row_number() over (partition by serial order by repair_dt desc) as seqnum
          from t
          where t2.repair_dt > sysdate - interval '42' day
         ) t
    where seqnum = 1;
    

    【讨论】:

    • 感谢您的快速回复。但是上面的查询是最近 6 个月的,对吗?在过去的 6 周里,我想这样做。我确实尝试用 trunc(sysdate) - (6*7) 替换 add_months(sysdate, -6) 但我得到空记录。
    • @KavinPalaniswamy 。 . .我修好了。
    • 我刚刚做了一个选择 sysdate - 从双重间隔'6'周;并得到一堆错误:ORA-30089: missing or invalid <datetime field> 30089. 00000 - "missing or invalid <datetime field>" *Cause: A <datetime field> (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND) is expected but not found, or a <datetime field> specified the <end field> in an <interval qualifier> is more significant than its <start field>.
    • @KavinPalaniswamy 。 . .我不知道 Oracle 不支持week(大多数数据库都支持)。无论如何,这有效:select sysdate - interval '42' day from dual.
    • @KavinPalaniswamy 。 . .这将针对第二个查询。另一种方法是使用row_number()。第一个查询不能返回重复项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2019-10-14
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多