我想得到emp當前作業部門的記錄,并附上開始日期
資料,在下面的資料Grp列中,我已經推匯出得到最后的第三條記錄,這是正確的結果。
資料,在下面的資料Grp列中,我得到了最后的第三條記錄,這是一個正確的結果。
loginName emp_name dept_id dept_name startDate endDate Grp
KK KKLeo 5652 POLO Business - Tech 1809-17 19-09-17 1
KK KKLeo 5652 POLO Business - Tech 1909-17 28-09-17 1
KK KKLeo 5652 POLO Business - Tech 2809-17 0911-17 1
KK KKLeo 5647 POLO業務 0911- 17 15-03-19 2
KK KKLeo 5647 POLO業務 15-03- 19 16-04-19 2
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 16- 04-19 03-05-19 3
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 03- 05-19 11-10-19 3
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 11- 10-19 22-07-20 3
KK KKLeo 5649 POLO Buss-Fixed Sales Mkt 22- 07-20 26-08-20 3
KK KKLeo 5652 POLO Business - Tech 260820 170221 4
KK KKLeo 5652 POLO Business - Tech 1702-21 19-02-21 4
KK KKLeo 5652 POLO商業-技術 19-02-21 null 4
到目前為止嘗試的查詢
select login_name,
emp_name,
dept_id。
部門名稱。
startDate,
endDate。
sum (counter) OVER (PARTITION BY emp_name order by startDate) grp
from (
select login_name,
emp_name,
dept_id。
部門名稱。
startDate,
endDate。
CASE WHEN DEPT_NAME = LAG(DEPT_NAME) OVER (PARTITION BY login_name, emp_name, dept_id ORDER BY startDate)
THEN 0
ELSE 1
END計數器
FROM empdepthist
)
我不能提前考慮,我如何使用Grp來獲得最后第三條記錄作為輸出。資料只有一個emp的細節,但它可能是很多。
預期輸出
KK KKLeo 5652POLO Business - Tech 26-08-20 17-02-21
uj5u.com熱心網友回復:
從Oracle 12開始,你可以使用MATCH_RECOGNIZE。
SELECT *
FROM empdepthist
MATCH_RECOGNIZE (
PARTITION BY loginname
ORDER BY startdate
衡量標準
First(emp_name) AS emp_name,
FIRST(dept_id) AS dept_id。
FIRST(dept_name) ASdept_name。
FIRST(startDate) as startdate,
FIRST(endDate) AS enddate
ONE ROW PER MATCH
PATTERN (same_dept $)
DEFINE same_dept AS First(dept_id) = dept_id
)
它的作業原理是:
PARTITION行BY loginname.- 在每個磁區中,
ORDER行BY startdate. DEFINEsame_dept模式為連續的行(在磁區內按給定的順序),其中匹配中的FIRST(dept_id)等于匹配中每個其他行的dept_id。- 要匹配的
PATTERN位于排序的末尾($),它與定義為匹配same_dept模式的一條或多條行()的模式相匹配。 - 當你已經匹配了模式,只回傳
每個匹配的一個行。 - 該行將包含
PARTITION BY子句中的列和MEASURES子句中定義的值,在這種情況下,它是來自匹配的FIRST行的值。
對于樣本資料來說,它的輸出結果是:
| LOGINNAME | EMP_NAME[/thDEPT_ID | DEPT_NAME明星日期ENDDATEKK | KKLeo |
|---|
?
db<>fiddle here
uj5u.com熱心網友回復:
你也可以使用視窗函式來做這個。 一種方法是簡單地列舉行(反向),一次按雇員,一次按部門。 這些對最后幾行是一樣的:
select loginname, emp_name, dept_id, min(startdate), max(startdate)。
from (select t.*,
row_number() over (partition by emp_name order by startd date desc) as seqnum_e,
row_number() over (partition by emp_name , dept_id order by startdate desc) as seqnum_ed
from t
) t
where seqnum_e = seqnum_ed
group by loginname, emp_name, dept_id, dept_name;
如果你的表很大,你可以將這種方法的性能與match recognize方法進行比較。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324996.html
標籤:
