SQL Server 2008 table 上的行数以识别重复项
Row count on a SQL Server 2008 table to identify duplicates
我有可以关联多个地址的记录,我将所有这些规范化为 table 这样我就可以看到属于记录的每个地址并识别重复项(基于地址行 1)。
我要识别的是一条具有两次相同地址的记录。我使用 CTE 并为每次出现的地址添加一个行号来完成此操作,但我忘记了这是重要的部分。对于每条记录,都有一个主地址,如果该地址是重复的,则该地址应始终具有最低的行号 (RN)。
偶尔会发生的情况是我的主地址与非主地址匹配,非主地址的 RN = 1 而我的主地址的 RN > 1。
因为我想停用这些,所以我正在寻找所有 RN > '1' 的地址,这些地址不是主要地址,但我最终错过了一堆结果。我添加了一个名为 'PRIMARY_ADDR' 的列,但不确定如何将此字段合并到 CTE 中。
Table
CREATE TABLE [dbo].[ALL_Address_Table]
(
[RECORD_ID] [varchar](50) NULL,
[EXT_ID] [varchar](50) NULL,
[ADDR_ID] [varchar](50) NULL,
[ADDR_LINE_1] [varchar](80) NULL,
[ADDR_LINE_2] [varchar](80) NULL,
[ADDR_ZIP] [varchar](50) NULL,
[ADDR_STATUS] [varchar](50) NULL,
[RN] [varchar](50) NULL,
[PRIMARY_ADDR] [varchar](50) NULL
) ON [PRIMARY]
INSERT INTO ALL_Address_Table
([RECORD_ID], [EXT_ID], [ADDR_ID], [ADDR_LINE_1], [ADDR_LINE_2], [ADDR_ZIP], [ADDR_STATUS], [RN], [PRIMARY_ADDR])
VALUES
(555678, '900120', '555678-100001', '123 MAIN ST','','58865','ACTIVE','','No'),
(555678, '900125', '555678-100002', '123 MAIN ST','','58865','ACTIVE','','Yes'),
(555678, '900145', '555678-100003', '123 MAIN ST','','58865','ACTIVE','','No'),
(555678, '900115', '555678-100004', '500 W TRAIN ST','','58873','ACTIVE','','No')
;
CTE
WITH cte AS
(
SELECT
[RECORD_ID], [EXT_ID], [ADDR_ID], [ADDR_LINE_1],
row_number() OVER(PARTITION BY RECORD_ID, ADDR_Line_1 ORDER BY RECORD_ID) AS [rn]
FROM ALL_Address_Table
)
update ALL_Address_Table
set RN = CTE.rn
from CTE
join ALL_Address_Table on CTE.RECORD_ID = ALL_Address_Table.RECORD_ID
where CTE.ADDR_ID = All_Address_Table.ADDR_ID
--This should not return a row with Primary_ADDR = 'Yes' but must be included in the count.
--I cannot just remove all the primary addresses or else I will miss the ones that have
--duplicates
select * from ALL_Address_Table where RN > '1'
SQL FIDDLE
http://sqlfiddle.com/#!3/52a0f/3
感谢任何建议。
也许你只是想将其更改为ORDER BY RECORD_ID, PRIMARY_ADDR DESC
,以便主地址获得第一个RN 槽?不确定为什么 RN 和 PRIMARY_ADDRESS 是宽 varchar 列。
我猜这是一次性代码,但您的连接条件可能更好:
inner join ALL_Address_Table
on CTE.ADDR_ID = All_Address_Table.ADDR_ID
RECORD_ID 检查看起来是多余的。
我有可以关联多个地址的记录,我将所有这些规范化为 table 这样我就可以看到属于记录的每个地址并识别重复项(基于地址行 1)。
我要识别的是一条具有两次相同地址的记录。我使用 CTE 并为每次出现的地址添加一个行号来完成此操作,但我忘记了这是重要的部分。对于每条记录,都有一个主地址,如果该地址是重复的,则该地址应始终具有最低的行号 (RN)。
偶尔会发生的情况是我的主地址与非主地址匹配,非主地址的 RN = 1 而我的主地址的 RN > 1。
因为我想停用这些,所以我正在寻找所有 RN > '1' 的地址,这些地址不是主要地址,但我最终错过了一堆结果。我添加了一个名为 'PRIMARY_ADDR' 的列,但不确定如何将此字段合并到 CTE 中。
Table
CREATE TABLE [dbo].[ALL_Address_Table]
(
[RECORD_ID] [varchar](50) NULL,
[EXT_ID] [varchar](50) NULL,
[ADDR_ID] [varchar](50) NULL,
[ADDR_LINE_1] [varchar](80) NULL,
[ADDR_LINE_2] [varchar](80) NULL,
[ADDR_ZIP] [varchar](50) NULL,
[ADDR_STATUS] [varchar](50) NULL,
[RN] [varchar](50) NULL,
[PRIMARY_ADDR] [varchar](50) NULL
) ON [PRIMARY]
INSERT INTO ALL_Address_Table
([RECORD_ID], [EXT_ID], [ADDR_ID], [ADDR_LINE_1], [ADDR_LINE_2], [ADDR_ZIP], [ADDR_STATUS], [RN], [PRIMARY_ADDR])
VALUES
(555678, '900120', '555678-100001', '123 MAIN ST','','58865','ACTIVE','','No'),
(555678, '900125', '555678-100002', '123 MAIN ST','','58865','ACTIVE','','Yes'),
(555678, '900145', '555678-100003', '123 MAIN ST','','58865','ACTIVE','','No'),
(555678, '900115', '555678-100004', '500 W TRAIN ST','','58873','ACTIVE','','No')
;
CTE
WITH cte AS
(
SELECT
[RECORD_ID], [EXT_ID], [ADDR_ID], [ADDR_LINE_1],
row_number() OVER(PARTITION BY RECORD_ID, ADDR_Line_1 ORDER BY RECORD_ID) AS [rn]
FROM ALL_Address_Table
)
update ALL_Address_Table
set RN = CTE.rn
from CTE
join ALL_Address_Table on CTE.RECORD_ID = ALL_Address_Table.RECORD_ID
where CTE.ADDR_ID = All_Address_Table.ADDR_ID
--This should not return a row with Primary_ADDR = 'Yes' but must be included in the count.
--I cannot just remove all the primary addresses or else I will miss the ones that have
--duplicates
select * from ALL_Address_Table where RN > '1'
SQL FIDDLE http://sqlfiddle.com/#!3/52a0f/3
感谢任何建议。
也许你只是想将其更改为ORDER BY RECORD_ID, PRIMARY_ADDR DESC
,以便主地址获得第一个RN 槽?不确定为什么 RN 和 PRIMARY_ADDRESS 是宽 varchar 列。
我猜这是一次性代码,但您的连接条件可能更好:
inner join ALL_Address_Table
on CTE.ADDR_ID = All_Address_Table.ADDR_ID
RECORD_ID 检查看起来是多余的。