Sql 如果某行在一年和一个季度内发生两次且状态不同,则需要删除该行
考虑EMP表Sql 如果某行在一年和一个季度内发生两次且状态不同,则需要删除该行,sql,sql-server,Sql,Sql Server,考虑EMP表 EID ENAME YEAR QUARTER AMOUNT STATUS 101 ABC 2001 1 1000 PAID 101 ABC 2001 1 1000 UNPAID 102 DEF 2001 1 2000 PAID 103 xyz 2001 1 3000 PAID 103
EID ENAME YEAR QUARTER AMOUNT STATUS
101 ABC 2001 1 1000 PAID
101 ABC 2001 1 1000 UNPAID
102 DEF 2001 1 2000 PAID
103 xyz 2001 1 3000 PAID
103 xyz 2001 1 3000 UNPAID
当且仅当eid以两种不同状态重复两次时,需要删除一行,
只需删除已付款状态的行
输出:
EID ENAME YEAR QUARTER AMOUNT STATUS
101 ABC 2001 1 1000 UNPAID
102 DEF 2001 1 2000 PAID
103 xyz 2001 1 3000 UNPAID
尝试这种方式,但不起作用:
With ctE_d(EID,ENAME,REPORTYEAR, REPORTQUARTER,SALARY,STATUS,rownumber)
as (
select EID,ENAME,REPORTYEAR, REPORTQUARTER,SALARY,STATUS, row_number()over(partition by EID,ENAME,REPORTYEAR, REPORTQUARTER,SALARY,STATUS
order by EID,ENAME,REPORTYEAR, REPORTQUARTER,SALARY,STATUS)as rank from EMPSAMPLE
WHERE STATUS='PAID')
delete from cte_d where rownumber<>1
使用CTE和窗口功能。假设状态仅具有两个值:
with todelete as (
select e.*,
min(status) over (partition by eid) as mins,
max(status) over (partition by eid) as maxs
from emp e
)
delete from todelete
where mins <> maxs and status = 'PAID';
使用CTE和窗口功能。假设状态仅具有两个值:
with todelete as (
select e.*,
min(status) over (partition by eid) as mins,
max(status) over (partition by eid) as maxs
from emp e
)
delete from todelete
where mins <> maxs and status = 'PAID';
我打赌,因为他们试图在他们的OP中使用row_编号,而这正是Nolan使用的,所以对他们个人来说,这更有意义。只是一个猜测。我打赌,因为他们试图在他们的OP中使用row_编号,而这正是Nolan所使用的,所以对他们个人来说更有意义。只是猜测而已。 EID ENAME YEAR QUARTER AMOUNT STATUS 1 101 ABC 2001 1 1000 UNPAID 2 102 DEF 2001 1 2000 PAID 3 103 xyz 2001 1 3000 UNPAID