例 有表如下
编号 | 创建时间 | 相同id |
---|---|---|
123 | 2022-1-1 | 2888 |
1234 | 2022-1-29 | 2888 |
12345 | 2022-2-10 | 2888 |
1222 | 2022-2-12 | 2888 |
1232 | 2022-2-12 | 4888 |
12324 | 2022-4-13 | 4888 |
123254 | 2022-5-13 | 4888 |
123456 | 2022-5-6 | 2888 |
2222 | 2022-5-6 | 3888 |
3333 | 2022-5-19 | 3888 |
44444 | 2022-6-16 | 3888 |
1.相同id : 相同记录的id值一样,和编号没有任何关系
2.编号:唯一
2.相同记录每隔60天计算一次,起始时间为第一条的创建时间,sql 怎么写
想要的结果
编号 | 创建时间 | 相同id |
---|---|---|
123 | 2022-1-1 | 2888 |
1232 | 2022-2-12 | 4888 |
123254 | 2022-5-13 | 4888 |
123456 | 2022-5-6 | 2888 |
2222 | 2022-5-6 | 3888 |
是这个样子得吗
SELECT PID,NAME,DT,ID FROM (
SELECT PID,NAME,DT,ID ,ROW_NUMBER()OVER(PARTITION BY SUBSTR(DT,1,7),NAME ORDER BY DT ) RO
FROM (
SELECT 1 PID,2888 ID , '张三' AS NAME ,'2022-01-01' DT FROM DUAL UNION ALL
SELECT 2 PID,2888 ID , '张三' AS NAME ,'2022-01-29' DT FROM DUAL UNION ALL
SELECT 3 PID,2888 ID , '张三' AS NAME ,'2022-02-10' DT FROM DUAL UNION ALL
SELECT 4 PID,2888 ID , '张三' AS NAME ,'2022-02-12' DT FROM DUAL UNION ALL
SELECT 5 PID,2888 ID , '张三' AS NAME ,'2022-05-06' DT FROM DUAL UNION ALL
SELECT 6 PID,3888 ID , '李四' AS NAME ,'2022-05-06' DT FROM DUAL UNION ALL
SELECT 7 PID,3888 ID , '李四' AS NAME ,'2022-05-19' DT FROM DUAL UNION ALL
SELECT 8 PID,3888 ID , '李四' AS NAME ,'2022-06-16' DT FROM DUAL )) A
WHERE RO = 1
select t.编号,t.创建时间,t.相同id
from 表 t
where exists (select 1 from (select t1.相同id, min(t1.创建时间) 创建时间 from 表 t1 group by t1.相同id) rs where rs.相同id = t.相同id and rs.创建时间 = t.创建时间)
可以通过2种方式实现每隔60天计算:
1、java代码定时轮询,网上很多教程
2、把以上sql语句写在oracle的函数或者存储过程里,通过oracle job实现轮询操作