正经问题: SQL 语言

速度快点的方式:临时表+cursor





DROP TABLE TEMP_LEAVERDS;

CREATE GLOBAL TEMPORARY TABLE TEMP_LEAVERDS ON COMMIT PRESERVE ROWS AS

(select LC.id,LC.dt

from LeaveCountry LC,

(select id,count(*)

from LeaveCountry

where dt<sysdate and dt>sysdate-730

group by id

having count(*)>=4) LI

where LC.id=LI.id

);



SET SERVEROUTPUT ON

DECLARE

v_id TEMP_LEAVERDS.ID%TYPE;

v_dt TEMP_LEAVERDS.DT%TYPE;

cursor CUR_LEAVEID is select id,dt from TEMP_LEAVERDS;

cursor CUR_MINDATE is select id,min(dt) dt from TEMP_LEAVERDS group by id;

BEGIN

open CUR_LEAVEID;

loop

fetch CUR_LEAVEID into v_id,v_dt;

exit when CUR_LEAVEID%NOTFOUND;

delete from TEMP_LEAVERDS where id=(select distinct id from TEMP_LEAVERDS where id=v_id and dt<>v_dt and abs(dt-v_dt)<30);

commit;

end loop;

close CUR_LEAVEID;

open CUR_MINDATE;

loop

fetch CUR_MINDATE into v_id,v_dt;

exit when CUR_MINDATE%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('ID: '||to_char(v_id)||', DATE: '||to_char(v_dt,'yyyy-mm-dd'));

end loop;

close CUR_MINDATE;

END;



老兄真是负责到底啊. 不过好象忽视了一个问题. 如果出境四次以上, 比如5次, 6次, 只要有四次记录满足互相之间>30天的要求, 按照题目要求ID就QUALIFY.



如果有人出境5次, 4次满足要求, 但是第5次小于30天. 这个程序就会FILTER OUT这个记录了. 这条鱼就漏网了.
 
闲着没事练练手。可能理解有些出入,总之就一思路,LZ根据自己的实际需求改吧。
 
闲着没事练练手。可能理解有些出入,总之就一思路,LZ根据自己的实际需求改吧。

不给钱你就把这码献出来啦。:eek:
 
昨天才学的SQL,我来试试。:D
下面的a,b, c, d是同一个数据集的四份拷贝。
第一段代码选出每个ID的任何730天内任何四个紧紧相邻的出境日期。
第二段代码判断四个日期的间隔是否都大于30天,如果是,选出对应的ID。

create table adjacent_dates as
select a.ID, a.date as d1, b.date as d2, c.date as d3, d.date as d4
from a, b, c, d
where
a.ID=b.ID
and b.ID=c.ID
and c.ID=d.ID
and d1<d2
and d2<d3
and d3<d4
and d4-d1<730
group by a.ID, d1
having d4-d1=min(d4-d1);



select distinct ID
from adjacent_dates
where d2-d1>30
and d3-d2>30
and d4-d3>30;
 
:D,Group by 还没学会


昨天才学的SQL,我来试试。:D
下面的a,b, c, d是同一个数据集的四份拷贝。
第一段代码选出每个ID的任何730天内任何四个紧紧相邻的出境日期。
第二段代码判断四个日期的间隔是否都大于30天,如果是,选出对应的ID。

create table adjacent_dates as
select a.ID, a.date as d1, b.date as d2, c.date as d3, d.date as d4
from a, b, c, d
where
a.ID=b.ID
and b.ID=c.ID
and c.ID=d.ID
and d1<d2
and d2<d3
and d3<d4
and d4-d1<730
group by a.ID, d1
having d4-d1=min(d4-d1);



select distinct ID
from adjacent_dates
where d2-d1>30
and d3-d2>30
and d4-d3>30;
 
简单数据库,个人出境记录。

每条记录两个variable: id 和 date (出境日期). 每个人可以有多条记录(多次出境)。

找出所有曾经在两年(730天)以内出境四次或以上的人,而且这四次出境记录任何两次之间的间隔必须大于30天。

请用SQL语言实现。

如果一个人多次满足以上条件地话, 需要第一次满足条件的时间,以后再满足条件不管了。


还是我来帮一下忙吧, 有奖励吗? 我有版权的哦。

select y.pid as person_id, y.sdate as first_qualified_date
from
(select x.pid, x.sdate, row_number() over (partition by x.pid order by x.sdate) as rak, count(pid) over (partition by x.pid) as cnt
from
(select pid, sdate, lead(sdate,1,sdate) over (partition by pid order by sdate)-sdate as days_diff
from t
where sdate>sysdate-730
) x
where days_diff>30
) y
where y.rak=1 and y.cnt>=4;
 
谢谢大家的帮助, 根据你们的方案, 我已经找到了解决的方法. 每个提供方案的人, 送一万CFC钱略表心意. 现在还没有那么多钱, 过几天送到, 再次表示感谢.
 
谢谢大家的帮助, 根据你们的方案, 我已经找到了解决的方法. 每个提供方案的人, 送一万CFC钱略表心意. 现在还没有那么多钱, 过几天送到, 再次表示感谢.

介位技坑主,把你的想法也贴上来行么?:blowzy:
 
解题答案,仅供参考。

sql.JPG
 
解题答案,仅供参考。

浏览附件323109

我的CODE -
select y.pid as person_id, y.sdate as first_qualified_date
---from
------(select x.pid, x.sdate, row_number() over (partition by x.pid order by x.sdate) as rak, count(pid) over (partition by x.pid) as cnt
------from
---------(select pid, sdate, lead(sdate,1,sdate) over (partition by pid order by sdate)-sdate as days_diff
------------from t
------------where sdate>sysdate-730
---------) x
------where days_diff>30
---) y
---where y.rak=1 and y.cnt>=4;


你的CODE和我的差不多,不同的是你的要求4次30天出境必须是连续的,我的是2年内满足任意4次出境30天。

好象楼主没有你做的这个要求。mips 和 helloccc 是同一个人???
 
学习了以上两位对lead和lag分析统计函数的使用,受益非浅:cool:

论坛里要是开设一个专门讨论一些感兴趣的技术问题的板块就好了,既然咱们村大部分人都是做IT的,可以促进相互之间的学习和交流。
 
我的CODE -
select y.pid as person_id, y.sdate as first_qualified_date
---from
------(select x.pid, x.sdate, row_number() over (partition by x.pid order by x.sdate) as rak, count(pid) over (partition by x.pid) as cnt
------from
---------(select pid, sdate, lead(sdate,1,sdate) over (partition by pid order by sdate)-sdate as days_diff
------------from t
------------where sdate>sysdate-730
---------) x
------where days_diff>30
---) y
---where y.rak=1 and y.cnt>=4;


你的CODE和我的差不多,不同的是你的要求4次30天出境必须是连续的,我的是2年内满足任意4次出境30天。

好象楼主没有你做的这个要求。mips 和 helloccc 是同一个人???

不知你有没有注意到,你有一个错误。假如某人2年内正好出境4次, 而且满足任意2次之间的天数大于30天,你的X对于此人返回4条记录,但是第4条记录的days_diff是0。于是只有3条记录满足days_diff>30的条件,此人就被过滤掉了。不知你明白否。
 
当个讨人嫌。我怀疑你们是程序猿吗?一个简单的问题,各种复杂的函数和语句都上来了。顶着锅盖说的。:D
 
后退
顶部