我需要设置一个查询,以允许我在一个组中选择最近更新的记录。如果两条记录都有最新的更新,那么应该选择更新历史最长的一条。如果两者都为空,或者两者具有相同的历史长度,则不应选择两者。这些字段是 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/