删除在不同列中具有特定值的列中具有重复值的行

  • 本文关键字:删除 sql sql-server
  • 更新时间 :
  • 英文 :


我有一个报告表(dbo.HighDonorPayments),数据如下:

ID   PAYMENTID  DONORID  MEMBERFIRSTNAME   MEMBERLASTNAME    ISBIGCHEESE
--------------------------------------------------------------------------
1    4133-ggi     661a   Samuel            Jackson           1
2    4133-ggi     661a   Samuel            Jackson           0          
3    4133-ggi     661a   Samuel            Jackson           0        
4    9392-ggi     990q   Space             Eye               0
5    9392-ggi     990q   Space             Eye               0

我需要删除重复的付款,但以一种非常具体的方式。

最终结果应该是:

ID   PAYMENTID  DONORID  MEMBERFIRSTNAME   MEMBERLASTNAME    ISBIGCHEESE
--------------------------------------------------------------------------
1    4133-ggi     661a   Samuel            Jackson           1
4    9392-ggi     990q   Space             Eye               0

ID   PAYMENTID  DONORID  MEMBERFIRSTNAME   MEMBERLASTNAME    ISBIGCHEESE
--------------------------------------------------------------------------
1    4133-ggi     661a   Samuel            Jackson           1
5    9392-ggi     990q   Space             Eye               0

我们有一个"分类"捐赠者表格。举个例子:给10美元,你就"很好";给25美元,你就"很好";给50美元,你就"很好"。陷阱是(尽管我反对),如果你给我们10美元,并被归类为"好";然后再给我们50美元,变成"大奶酪",你就有了一个"好"。和分类表中的BIGCHEESE记录。客户希望看到一段时间内的付款情况。如果捐赠者是"大奶酪",她希望看到该记录被标记。

因为我加入了" categoration& quot;表中,我得到了重复的付款记录。我需要以这样一种方式删除重复项,即任何"ISBIGCHEESE=1"记录是"受保护的"。但其他情况像往常一样重复删除。

对于Samuel Jackson的例子,我想删除第2行和第3行,但保留第1行。但对于Space Eye来说,删除哪条记录并不重要。

我尝试使用CTE来删除重复项:

WITH eye_cte AS 
(
SELECT 
paymentid, 
ROW_NUMBER() OVER (PARTITION BY paymentid ORDER BY revenueid) row_num 
FROM 
dbo.HighDonorPayments
) 
DELETE FROM eye_cte 
WHERE row_num > 1;

此操作用于删除重复项,但"已保存"的记录除外。是……我想是随机的。我不知道该怎么说,"嘿!删除所有重复的情况下,PAYMENTID是相同的,但如果成员有一个大奶酪评级,"保护"那个。

我不知道我要做的是可能的,我可能只需要改变首先填充这个表的查询过程。

我需要以这样一种方式删除重复项,即任何"ISBIGCHEESE=1"记录是"受保护的"。但其他情况像往常一样重复删除

你想要"保护">

通过为它们生成row_num=1来删除这些行,因为您正在删除WHERE row_num > 1

。因此,您必须重构ROW_NUMBER列的ORDER BY,以便ISBIGCHEESE=1行先出现。

将这些行推到前面,像这样执行ORDER BY CASE WHEN ISBIGCHEESE=1 THEN 0 ELSE 1 END, ...

WITH eye_cte AS 
(
SELECT 
paymentid, 
ROW_NUMBER() OVER (PARTITION BY paymentid ORDER BY
CASE WHEN ISBIGCHEESE=1 THEN 0 ELSE 1 END, revenueid) row_num 
FROM 
dbo.HighDonorPayments
) 
DELETE FROM eye_cte 
WHERE row_num > 1;

我认为这应该像做一个标志一样简单

WITH eye_cte AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY paymentid ORDER BY revenueid) row_num,
CASE WHEN isbigcheese = 1 THEN 1 ELSE 0 END as is_protected
FROM DBO.highdonorpayments
)
DELETE FROM eye_cte
WHERE row_num > 1 AND is_protected = 0

如果isbigcheese只能为1或0,则MAX(isbigcheese)应该满足您的需求。小提琴

SELECT 
DISTINCT
MIN(ID) ID
, PAYMENTID
, DONORID
, MEMBERFIRSTNAME
, MEMBERLASTNAME
, MAX(ISBIGCHEESE) ISBIGCHEESE
FROM HighDonorPayments
GROUP BY DONORID, PAYMENTID, MEMBERFIRSTNAME, MEMBERLASTNAME

返回
PAYMENTIDtbody> <<tr>6614
IDDONORIDMEMBERFIRSTNAMEMEMBERLASTNAMEISBIGCHEESE
14133 - ggi撒母耳道明>1
9392 - ggi990 q空间眼睛0

最新更新