Sql 如果某行在一年和一个季度内发生两次且状态不同,则需要删除该行

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

考虑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    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