我有一个报告表(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
返回ID | PAYMENTIDDONORID | MEMBERFIRSTNAME | MEMBERLASTNAME | ISBIGCHEESE | 1 | 4133 - ggi | 661撒母耳道明> | 1 | 4
---|---|---|---|---|---|
9392 - ggi | 990 q | 空间 | 眼睛 | 0 |