我在SQL Server中有一個表,允許用戶更改員工詳細信息。每次將新記錄放入EMPLOYEE_HIST
表中時。只有EMP_ID
爲員工保持不變,所有其他細節都可以修改。選擇員工詳細信息中的更改
此外,還有一個SEQ_NO
列,它維護所做的條目序列。
EMPLOYEE_HIST:
SEQ_NO EMP_ID SOME_VAL1 SOME_VAL2
1 E1 V11 V21 (initial value of this employee)
2 E2 V12 V22 (initial value of this employee)
3 E3 V13 V23 (initial value of this employee)
4 E2 V00 V22
5 E1 V01 V21
6 E2 V02 V22
7 E4 V00 V00 (initial value of this employee)
我想要一個查詢,這將給我的變化,以特定僱員的,像
EMP_ID SOME_VAL1_OLD SOME_VAL1_NEW SOME_VAL2_OLD SOME_VAL2_NEW
E1 V11 V01 V21 V21
E2 V12 V00 V22 V22
E2 V00 V02 V22 V22
UPDATE 另外員工詳細信息可以由用戶進行修改n
次數,對於每次更改,結果集中應存在一行。 請幫忙。
編輯: 我終於用了LAG函數解決了。它會這樣工作:
SELECT *,ROW_NUMBER() OVER(PARTITION BY EMP_ID,CHANGE_NO ORDER BY EMP_ID,CHANGE_NO,SEQ_NO)
FROM(
SELECT * FROM EMPLOYEE_HIST(SELECT LAG(SOME_VAL1)
OVER(PARTITION BY EMP_ID ORDER BY EMP_ID,SEQ_NO) AS OLD_VAL, SOME_VAL1 AS NEW_VAL, '1' AS CHANGE_NO) T
WHERE OLD_VAL<>NEW_VAL UNION ALL
SELECT * FROM EMPLOYEE_HIST(SELECT LAG(SOME_VAL1) OVER(PARTITION BY EMP_ID ORDER BY EMP_ID,SEQ_NO) AS OLD_VAL, SOME_VAL2 AS NEW_VAL, '2' AS CHANGE_NO) T
WHERE OLD_VAL<>NEW_VAL) TEMP
但是,在包含300萬條記錄的表上獲取總共500行的性能非常慢。請提出一些建議,以改善排序成本。
hi @Ajinkya Deshmukh,你在EMPLOYEE_HIST表中有修改日期列嗎? – user3583912
是的,有last_update_time,後面的記錄也有更高的序列號。 –
您使用的是哪個版本的SQL服務器? – Kateract