【发布时间】:2021-08-28 17:52:06
【问题描述】:
关于重复的最后一个问题。我了解如何在 HAVING 子句 > 1 的情况下使用 COUNT(*) 来选择重复记录,但我面临着在满足条件时删除重复记录的挑战。
我昨天在账单金额取消时删除重复项时询问了其中的一部分,但现在我必须在其中包含一个标准,当账单金额具有相同的正负值时,日期是两者以及代码都相同。
例如,记录 1 的帐单金额为 250 美元,代码为“JUN”,日期为 03/02/2020,记录 2 的帐单金额为 250 美元,代码为“PII”,日期为 03/07 /2020 和记录 3 的账单金额为 -$250,代码为“PII”,日期为 03/07/2020。我希望在此示例中看到的结果仅为记录 1,其中记录 2 和 3 将根据我所述的标准被视为重复项。
表创建:
CREATE TABLE Billing (
BillId varchar(10),
SerialNo varchar(10),
BillAmt MONEY,
Code varchar(5),
DispenseDt DATE
);
数据输入:
INSERT INTO Billing (BillId, SerialNo, BillAmt, Code, DispenseDt)
VALUES ('BL_001','aaa-111',250,'AAP','20200503')
,('BL_002','aab-112',250,'ADD','20200309')
,('BL_003','aab-112',-250,'ADD','20200309')
,('BL_004','aba-120',700,'YED','20200503')
,('BL_005','aba-120',370,'TPP','20200822')
,('BL_006','aba-120',370,'TPP','20201003')
,('BL_007','aba-120',400,'TPP','20200822')
,('BL_008','aba-120',-370,'TPP','20200822')
,('BL_009','aba-120',-700,'YED','20200503')
,('BL_010','baa-201',1000,'TOK','20200927')
,('BL_011','baa-201',-1000,'TOK','20200927')
,('BL_012','bab-210',1000,'TOK','20200927');
样本数据:
+----------+-----------+---------+------+------------+
| BillId | SerialNo | BillAmt | Code | DispenseDt |
+----------+-----------+---------+------+------------+
| BL_001 | aaa-111 | $250 | AAP | 20200503 |
| BL_002 | aab-112 | $250 | ADD | 20200309 |
| BL_003 | aab-112 |-$250 | ADD | 20200309 |
| BL_004 | aba-120 | $700 | YED | 20200503 |
| BL_005 | aba-120 | $370 | TPP | 20200822 |
| BL_006 | aba-120 | $370 | TPP | 20201003 |
| BL_007 | aba-120 | $400 | TPP | 20200822 |
| BL_008 | aba-120 |-$370 | TPP | 20200822 |
| BL_009 | aba-120 |-$700 | YED | 20200503 |
| BL_010 | baa-201 | $1000 | TOK | 20200927 |
| BL_011 | baa-201 |-$1000 | TOK | 20200927 |
| BL_012 | bab-210 | $1000 | TOK | 20200927 |
+----------+-----------+---------+------+------------+
想要的结果:
+----------+-----------+---------+------+------------+
| BillId | SerialNo | BillAmt | Code | DispenseDt |
+----------+-----------+---------+------+------------+
| BL_001 | aaa-111 | $250 | AAP | 20200503 |
| BL_006 | aba-120 | $370 | TPP | 20201003 |
| BL_007 | aba-120 | $400 | TPP | 20200822 |
| BL_012 | bab-210 | $1000 | TOK | 20200927 |
+----------+-----------+---------+------+------------+
我的代码:
select a.SerialNo, a.BillAmt, a.Code, a.DispenseDt
from (
select *,
count(SerialNo) over(partition by SerialNo, DispenseDt) b
from Billing ) a
where b = 1
AND
InvoiceDt >= '20200601' And InvoiceDt <= '20200630'
AND
FacID IN ('IND600','IND605','IND610','IND620','IND630','IND640','IND650','IND660','IND670','IND680','IND690','IND695')
ORDER BY a.Serial;
【问题讨论】:
-
在您的示例中,记录 2 和 3 是否会因为余额等于 0 而被视为重复?
-
@tj cappelletti - 是的,但也因为日期和代码值相同。
-
BL_012 应该不会出现,因为金额/日期和代码相同,您能确认一下吗?
标签: sql duplicates ssms