我的桌子看起来像这样:
我需要的结果是,用户=' 12345'更改了他们的护照。 empid是员工ID,userid是HR Personnel。
这是我的疑问:
SELECT * FROM audit_is_emppersonal
WHERE date between '09/25/2017' and
'12/12/2017'
and userid='12345'
**更新
正如你所看到的那样,只有用户名=' 12345'
才能更改护照。答案 0 :(得分:0)
在您描述的条件下汇总员工,然后检查具有多个护照号码的员工。这意味着用户12345
实际上改变了该员工的护照号码。
WITH cte AS (
SELECT empid
FROM yourTable
WHERE
date BETWEEN '09/25/2017' AND '12/12/2017' AND
userid = '12345'
GROUP BY empid
HAVING COUNT(DISTINCT passportno) > 1 AND
SUM(CASE WHEN action = 'AFTER UPD' THEN 1 ELSE 0 END) > 0
)
SELECT *
FROM yourTable
WHERE
empid IN (SELECT empid FROM cte);
答案 1 :(得分:0)
如果我正确理解您的要求,您可以使用ROW_NUMBER:
WITH Latest_Passport_Update AS(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY empid, action ORDER BY date DESC) AS Latest
FROM audit_is_emppersonal
WHERE date between '09/25/2017' and '12/12/2017'
)
SELECT * FROM Latest_Passport_Update
WHERE Latest = 1
AND userid = '12345'
答案 2 :(得分:0)
根据您显示的内容,您似乎始终有一个date
的记录,一个记录有动作'BEFORE UPD'
,另一个记录有动作'AFTER UPD'
,您希望何时看到passwordno
在这样的过程中被改变了。
select
bu.userid,
bu.date,
bu.empid,
bu.passportno as passportno_before_update,
au.passportno as passportno_after_update
from (select * from audit_is_emppersonal where action = 'BEFORE UPD') bu
join (select * from audit_is_emppersonal where action = 'AFTER UPD') au
on au.userid = bu.userid
and au.empid = bu.empid
and au.date = bu.date
and au.passportno <> bu.passportno
where bu.userid = 12345
and bu.date between '20170925' and '20171212';
(您可能需要根据必须完全匹配的内容稍微调整ON
子句,以便为同一更新识别两条记录。)
答案 3 :(得分:0)
您可以使用Exception
和LEAD
查看以下和之前的记录:
LAG
(同样,您可能需要调整比较。例如,select empid, passportno, marital_status, action, userid, date
from
(
select
empid, passportno, marital_status, action, userid, date,
lag(date) over (order by date, empid, userid) as prev_date,
lag(empid) over (order by date, empid, userid) as prev_empid,
lag(userid) over (order by date, empid, userid) as prev_userid,
lag(passportno) over (order by date, empid, userid) as prev_passportno,
lead(date) over (order by date, empid, userid) as next_date,
lead(empid) over (order by date, empid, userid) as next_empid,
lead(userid) over (order by date, empid, userid) as next_userid,
lead(passportno) over (order by date, empid, userid) as next_passportno
from audit_is_emppersonal
where userid = '12345'
and date between '20170925' and '20171212'
) data
where
(
date = prev_date and
empid = prev_empid and
userid = prev_userid and
passportno <> prev_passportno
)
or
(
date = next_date and
empid = next_empid and
userid = next_userid and
passportno <> next_passportno
)
order by date, empid, userid, action desc;
在同一更新的两个记录中是否总是完全相同?如果不是,则必须更改date
和{ {1}}相应地。)