如下兩個資料庫,分別是 出國資料庫 和 回國資料庫
出國資料庫
證件號碼 出國日期
001 20160207
004 20151111
003 20160730
001 20150101
001 20150308
001 20150901
002 20160101
002 20160728
003 20150202
回國資料庫
證件號碼 回國日期
001 20160217
004 20151113
003 20160815
001 20150120
001 20150309
001 20151001
002 20160801
002 20160110
003 20150209
現在希望 查詢出
1. 所有出境行程超過1周的人員。
2. 所有出境行程沒有超過一周的人員。
好久沒做資料庫了,搞了半天沒搞出來。
uj5u.com熱心網友回復:
出國資料庫中第一條對于回國資料庫中的第一條么?就是第一條是出國日期,回國資料庫中的第一條就是這次的回國日期?
uj5u.com熱心網友回復:
不是,出國日期和回國日期不是按順序對應的uj5u.com熱心網友回復:
如果有3 條出國記錄,而只有 2 潭訓國記錄,這個怎么算呢?uj5u.com熱心網友回復:
第三條出國記錄如果沒有回國記錄,就不統計uj5u.com熱心網友回復:
那我如何知道哪一條出國記錄對應回國記錄?uj5u.com熱心網友回復:
現在我的問題就是無法確定哪一條出國記錄對應回國記錄,算不出需要的結果uj5u.com熱心網友回復:
select a.zjh,datediff(day,a.cgrq,decode(b.hgrq,null,sysdate(),b.hgrq)) cgsjfrom (select zjh,cgrq,row_number() over (partition by zjh order by cgrq asc) xh from cgsjk) a
left join (select zjh,hgrq,row_number() over (partition by zjh order by hgrq asc) xh from hgsjk) b on a.zjh=b.zjh and a.xh=b.xh
瞎寫的,不懂對不對
uj5u.com熱心網友回復:
with t as
(select '001' as card_id,'20160207' as t_date from dual union all
select '004','20151111' from dual union all
select '003','20160730' from dual union all
select '001','20150101' from dual union all
select '001','20150308' from dual union all
select '001','20150901' from dual union all
select '002','20160101' from dual union all
select '002','20160728' from dual union all
select '003','20150202' from dual )
,t1 as
(select '001' as card_id,'20160217' as t_date from dual union all
select '004','20151113' from dual union all
select '003','20160815' from dual union all
select '001','20150120' from dual union all
select '001','20150309' from dual union all
select '001','20151001' from dual union all
select '002','20160801' from dual union all
select '002','20160110' from dual union all
select '003','20150209' from dual)
SELECT A.CARD_ID, A.T_DATE AS "出國時間", T1.T_DATE AS "回國時間",
TO_DATE(T1.T_DATE, 'YYYY-MM-DD') - TO_DATE(A.T_DATE, 'YYYY-MM-DD') + 1 AS "出國時間" -- 算頭不算尾
FROM (SELECT CARD_ID, T_DATE,
NVL(LEAD(T_DATE) OVER(PARTITION BY CARD_ID ORDER BY T_DATE),
'9999-12-31') AS LAST_DATE
FROM T) A
LEFT JOIN T1
ON T1.CARD_ID = A.CARD_ID
AND T1.T_DATE >= A.T_DATE
AND T1.T_DATE < A.LAST_DATE
ORDER BY A.CARD_ID, A.T_DATE
uj5u.com熱心網友回復:
給你刪掉了 2 個字。

uj5u.com熱心網友回復:
給出國、回國記錄中加入一個標志欄位,表示出國和回國然后把兩個集合合并
用分析函式處理
uj5u.com熱心網友回復:
哪一條出國時間對應哪一潭訓國時間?完全憑借時間的先后匹配?
uj5u.com熱心網友回復:
with t1 as
(select '001' as hm,'20160207' as cgrq from dual union all
select '004','20151111' from dual union all
select '003','20160730' from dual union all
select '001','20150101' from dual union all
select '001','20150308' from dual union all
select '001','20150901' from dual union all
select '002','20160101' from dual union all
select '002','20160728' from dual union all
select '003','20150202' from dual ),
t2 as
(select '001' as hm,'20160217' as hgrq from dual union all
select '004','20151113' from dual union all
select '003','20160815' from dual union all
select '001','20150120' from dual union all
select '001','20150309' from dual union all
select '001','20151001' from dual union all
select '002','20160801' from dual union all
select '002','20160110' from dual union all
select '003','20150209' from dual),
h1 as (select t1.*,row_number() over (partition by hm order by cgrq) rn from t1),
h2 as (select t2.*,row_number() over (partition by hm order by hgrq) rn from t2)
select h1.hm,h1.cgrq,h2.hgrq from h1 left join h2 on (h1.hm=h2.hm and h1.rn=h2.rn) order by 1,2;
uj5u.com熱心網友回復:
說一下思路出國表為c,回國表為hselect h.time-c.time day from c,h where c.id = h.id and day >7;
uj5u.com熱心網友回復:
應該是根據證件號匹配吧,他這隨便輸的舉例吧
uj5u.com熱心網友回復:
就沒有人覺得這個表設計的就不好嗎 這樣子找對應關系明顯不行啊 要不就加個另外的公共欄位咯uj5u.com熱心網友回復:
我的理解是 1. 每個表都加一個第幾次出國的欄位,然后通過 證件號碼和出國次數抓取時間來匹配。2.如果表中存的都是最后一次出國和回國的記錄的話,則可以根據時間來做判斷。當對應證件號碼的回國時間比出國時間還早的話,證明是上一次出國后回國的時間,這一次還未回來。當回國時間比出國時間晚的話,證明已經回國了,然后根據兩個時間能判斷出是否超過一周。
uj5u.com熱心網友回復:
明顯表設計有問題。。。16樓補充的蠻好的
uj5u.com熱心網友回復:
這兩個表都是縱表先轉換成橫表 在橫表里把出國、回國對應起來把
uj5u.com熱心網友回復:
資訊不明顯,要給出肯定的情況。uj5u.com熱心網友回復:
出現相同人出入境情況,應就出入境時間段最小的來進行資料匹配。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/94860.html
標籤:基礎和管理
上一篇:資料遷移到故障轉移群集服務器
