Sql 扭曲复制
我面临着从一个有2.5亿行的表中删除重复项的挑战 为了便于使用,假设我们有三列 帐户、费用代码、文件名 现在,扭转 如果重复的帐户和费用代码组合出现在同一个文件名中,则允许重复的帐户和费用代码组合,但如果帐户和费用代码组合正好存在于另一个文件名中,则应删除重复的帐户和费用代码组合 我已经尝试了(分区方式)上的ROW_NUMBER()并获得了副本,但没有重复我要的“其他文件”副本Sql 扭曲复制,sql,sql-server-2012,Sql,Sql Server 2012,我面临着从一个有2.5亿行的表中删除重复项的挑战 为了便于使用,假设我们有三列 帐户、费用代码、文件名 现在,扭转 如果重复的帐户和费用代码组合出现在同一个文件名中,则允许重复的帐户和费用代码组合,但如果帐户和费用代码组合正好存在于另一个文件名中,则应删除重复的帐户和费用代码组合 我已经尝试了(分区方式)上的ROW_NUMBER()并获得了副本,但没有重复我要的“其他文件”副本 ACCOUNT CODE FILE_NAME 001 00001 A.TXT 001
ACCOUNT CODE FILE_NAME
001 00001 A.TXT
001 00001 A.TXT
001 00001 A.TXT
001 00001 B.TXT
001 00001 C.TXT
B.txt和C.txt将被删除
我尝试了(分区方式)上的ROW_NUMBER()并获得了重复项,但没有找到我要的重复项“other file duplicate”
ACCOUNT CODE FILE_NAME
001 00001 A.TXT
001 00001 A.TXT
001 00001 A.TXT
001 00001 B.TXT
001 00001 C.TXT
这是我尝试过的完整代码,但不确定如何对同一文件的行号进行分组
SELECT TB1.[CLIENT_FACILITY_ID], TB1.[ACCOUNT], TB1.[CHARGE_DESC], TB1.[CHARGE_CODE], TB1.[CHARGE_TYPE], TB1.[BATCH_DATE],
TB1.[CHARGE_DATE], TB1.[CHARGE_QTY], TB1.[CHARGE_AMT], TB1.[HCPCS], TB1.[RC], TB1.[FILE_NAME], TB1.[MODIFIER], TB1.[POA], TB1.[POSTING_DATE], TB1.ROW_NUMBER
FROM
(SELECT [CLIENT_FACILITY_ID], [ACCOUNT], [CHARGE_DESC], [CHARGE_CODE], [CHARGE_TYPE], [BATCH_DATE],
[CHARGE_DATE], [CHARGE_QTY], [CHARGE_AMT], [HCPCS], [RC], [FILE_NAME], [MODIFIER], [POA], [POSTING_DATE],
ROW_NUMBER() OVER (PARTITION BY [CLIENT_FACILITY_ID], [ACCOUNT], [CHARGE_DESC], [CHARGE_CODE], [CHARGE_TYPE], [BATCH_DATE],
[CHARGE_DATE], [CHARGE_QTY], [CHARGE_AMT], [HCPCS], [RC], [MODIFIER], [POA], [POSTING_DATE], [FILE_NAME]
ORDER BY [CLIENT_FACILITY_ID], [ACCOUNT], [CHARGE_DESC], [CHARGE_CODE], [CHARGE_TYPE], [BATCH_DATE],
[CHARGE_DATE], [CHARGE_QTY], [CHARGE_AMT], [HCPCS], [RC], [MODIFIER], [POA], [POSTING_DATE]) ROW_NUMBER
FROM DAT_CHARGES
WHERE ACCOUNT LIKE 'O%') TB1
WHERE TB1.ROW_NUMBER > 1
我需要能够提供在本例中被视为重复的所有行的列表
谢谢您的时间。如果您想保留
文件名
的值最多的行(对于给定的组),您可以使用窗口功能来识别重复项:
select t.*
from (select dc.*,
dense_rank() over (partition by account, code order by cnt_acf desc, filename) as seqnum
from (select dc.*,
count(*) over (partition by account, code, filename) as cnt_acf
from dat_charges
) dc
) dc
where seqnum > 1;
如果要保留
filename
的值最多的行(对于给定的组),可以使用窗口函数来识别重复项:
select t.*
from (select dc.*,
dense_rank() over (partition by account, code order by cnt_acf desc, filename) as seqnum
from (select dc.*,
count(*) over (partition by account, code, filename) as cnt_acf
from dat_charges
) dc
) dc
where seqnum > 1;
不带窗口功能,使用CTE和
按帐户、代码、文件名分组以获取每个组中不重复的文件名:
with cte as (
select account, code
from dat_charges
group by account, code
having count(*) = 1
)
select d.account, d.code, d.file_name
from dat_charges d left join cte c
on c.account = d.account and c.code = d.code
where c.account is null
group by d.account, d.code, d.file_name
having count(*) = 1
请参阅不带窗口功能、带有CTE和按帐户、代码、文件名分组的。
,以获取每个组中不重复的文件名:
with cte as (
select account, code
from dat_charges
group by account, code
having count(*) = 1
)
select d.account, d.code, d.file_name
from dat_charges d left join cte c
on c.account = d.account and c.code = d.code
where c.account is null
group by d.account, d.code, d.file_name
having count(*) = 1
请参阅。
谢谢您的回复。您提出了另一个我没有预料到的障碍。我将尝试您的代码并查看结果。虽然这很有效,但客户已经放弃了他们所要求的功能。我感谢你们的努力。谢谢你们的回复。你们提出了另一个我没有预料到的障碍。我将尝试您的代码并查看结果。虽然这很有效,但客户已经放弃了他们所要求的功能。谢谢你的努力,谢谢你的回复。客户完全改变了主意,但我非常感谢您的回复。谢谢您的回复。客户完全改变了主意,但我非常感谢您的回复。