sql - 查询非日期格式的特定属性的最新日期

标签 sql database oracle

我需要设置一个查询,以允许我在一个组中选择最近更新的记录。如果两条记录都有最新的更新,那么应该选择更新历史最长的一条。如果两者都为空,或者两者具有相同的历史长度,则不应选择两者。这些字段是 varchar2 格式。第一条记录和最后一条记录中的最后两位数字对应于这些记录的拍摄年份。历史长度中的字母对应于获取的数据类型的代码。下面是一个示例表,具有预期的结果:

| group_id  |    id |   First Record  |  Last Record    |     History Length    |
---------------------------------------------------------------------------------
|   a       |    1  |  record98       |    record16     | SNDAWEDSPSEDSYSEAOE   |
|   a       |    2  |  record97       |    record14     | AVNDAWEDSPSEDSYS      |
|   b       |    3  |  record96       |    record15     | BVNDAWEDSPSEDSYSEAOE  |
|   b       |    4  |  record98       |    record16     | UNDAWEDSPSEDSYSEAOP   |
|   b       |    5  |  record95       |    record16     | UNDAWEDSPSEDSYSEAOPHYE|
|   c       |    6  |  record96       |    record12     | BVNDAWEDSPSEDSYSE     |
|   c       |    7  |  record10       |   record15      | HUSIKD                |
|   d       |    8  |    null         |      null       |            null       |
|   d       |    9  |    null         |      null       |            null       |
|   e       |   10  |  record11       |  record16       |    ASIKSO             |
|   e       |   11  |  record11       |  record16       |    SIXLLO             |
-------------------------------------------------------------------------------------------------------------------

输出

| group_id  |    id |   First Record  |  Last Record    |     History Length    |
---------------------------------------------------------------------------------
|   a       |    1  |  record98       |    record16     | SNDAWEDSPSEDSYSEAOE   |
|   b       |    5  |  record95       |    record16     | UNDAWEDSPSEDSYSEAOPHYE|
|   c       |    7  |  record10       |   record15      | HUSIKD                |

历史不如最新记录重要,所以如果这太难实现,我只需要最新记录的一行。谢谢。

最佳答案

让我知道以下查询是否满足您的要求。

SELECT group_id,ID,first_record,last_record,history_length
FROM (
      SELECT group_id,ID,first_record,last_record,history_length,diff,
             MAX(LENGTH(history_length)) OVER (PARTITION BY group_id) max_len,
             count(1) OVER (PARTITION BY group_id,LENGTH(history_length)) cnt
      FROM (
           SELECT  group_id,ID,first_record,last_record,history_length,
                   count(1) OVER (PARTITION BY group_id,LENGTH(history_length)) cnt,
                   MAX(to_date(to_number(substr(last_record, 7,2)),'RR')-to_date(to_number(substr(first_record, 7,2)),'RR'))   OVER (PARTITION BY group_id) diff
           FROM (
                 SELECT group_id,ID,first_record,last_record,history_length,
                        MAX(last_record) OVER (PARTITION BY group_id) max_last_record
                 FROM  t
                 WHERE nvl(first_record,last_record) IS NOT NULL
                 )
                 WHERE last_record=max_last_record
           )
           WHERE   (to_date(to_number(substr(last_record, 7,2)),'RR')-to_date(to_number(substr(first_record, 7,2)),'RR'))=diff
      )
WHERE cnt=1
AND   LENGTH(history_length)=max_len;

关于sql - 查询非日期格式的特定属性的最新日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40285625/

相关文章:

sql - PostgreSQL 与 json 数组中的模式反向 LIKE

mysql - 如何使用TSQL生成Json

mysql - mysql查询返回受WHERE子句限制的内连接数

mysql - 防止第三方连接到 SQL 数据库(来自 config.php 文件)

database - 使用 Clojure 在数据库上循环

oracle - 测试数据库以测试 Oracle 中的性能调优技术

oracle - 定义虚拟列后将记录插入oracle

sql - 将 ClickHouse 中嵌套类型的不同键值对收集到数组中

r - 为变量中的每个唯一元素创建一个转换矩阵

Oracle ORA-03113 和 ORA-07445 ACCESS_VIOLATION