我应该如何选择一列与另一列相关的语句?

时间:2017-12-13 06:09:05

标签: sql sql-server-2008 tsql

我的桌子看起来像这样:

table1

我需要的结果是,用户=' 12345'更改了他们的护照。 empid是员工ID,userid是HR Personnel。

这是我的疑问:

SELECT * FROM audit_is_emppersonal
WHERE date between '09/25/2017' and 
'12/12/2017' 
 and userid='12345'

**更新

这是我的预期结果: enter image description here

正如你所看到的那样,只有用户名=' 12345'

才能更改护照。

4 个答案:

答案 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)

您可以使用ExceptionLEAD查看以下和之前的记录:

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}}相应地。)