【问题标题】:Find duplicates using parcel number and updated their status. SQL Server 2014使用包裹号查找重复项并更新其状态。 SQL Server 2014
【发布时间】:2020-06-04 23:19:54
【问题描述】:

我在 SQL Server 2014 数据库中遇到重复记录的问题。

用户会收到一张印有包裹号码的小明信片。 明信片还显示了一个简单表格的链接,他们可以使用该表格来登记他们的包裹。

很遗憾,该表单没有任何类型的验证,以确保不会多次提交同一个包裹。 我目前无法控制 Web 表单,我不确定负责团队需要多长时间才能对其进行验证。

所以我必须想出一个例程来停用重复记录,并且只保留一个。

这必须是一个处理大量记录的查询,没有令牌传递给例程。

当 web 表单被提交时,它会按顺序创建一个记录 id,并分配一个“已注册”的应用程序状态。 我认为纠正这个问题的方法是,为每个包裹获取最高记录 id 值,然后保留那个,其余的必须停用。

停用记录状态为“I”的非最新记录 将 APPLICATION_STATUS 设置为“已关闭”以显示非最新记录

我使用的查询,返回 4 列:Record Id、Parcel Number、Record Status 和 Application Status

SELECT 
    B.[RECORD_ID], 
    B.[PARCEL_NBR], 
    B.[RECORD_STATUS],  -- The value of this column would be "I" for the duplicate records.
    B.[APPLICATION_STATUS]
FROM 
    A_TABLE A
INNER JOIN B_TABLE B 
    ON A.PARCEL_NBR = B.PARCEL_NBR
    AND (A.APPLICATION_STATUS IS NULL
    OR B.APPLICATION_STATUS = 'Registered');

初始输出:

RECORD_ID   PARCEL_NBR      RECORD_STATUS   APPLICATION_STATUS
REC-00081   0608012098      A               Registered
REC-00082   0608012098      A               Registered
REC-00083   0608012098      A               Registered

预期输出:

RECORD_ID   PARCEL_NBR      RECORD_STATUS   APPLICATION_STATUS
REC-00081   0608012098      I               Closed  - this record got updated
REC-00082   0608012098      I               Closed  - this record got updated
REC-00083   0608012098      A               Registered  

我认为光标可能是解决方案的一部分?老实说,我不确定。我恳请您的帮助。

【问题讨论】:

  • 哪些列来自 A_TABLE,哪些列来自 B_TABLE?
  • 嗨,哨兵 - 我更新了查询。这些都是表 B 列。

标签: sql sql-server duplicates sql-update


【解决方案1】:

你可以使用窗口函数和case逻辑:

SELECT B.[RECORD_ID],  B.[PARCEL_NBR], 
       (CASE WHEN ROW_NUMBER() OVER (PARTITION BY B.PARCEL_NBR ORDER BY B.RECORD_ID DESC) > 1
             THEN 'I' ELSE B.[RECORD_STATUS]
         END) as RECORD_STATUS,
       (CASE WHEN ROW_NUMBER() OVER (PARTITION BY B.PARCEL_NBR ORDER BY B.RECORD_ID DESC) > 1
             THEN Closed  - this record got updated ELSE B.APPLICATION_STATUS
         END) as APPLICATION_STATUS,
    B.[]
FROM A_TABLE A JOIN
     B_TABLE B 
     ON A.PARCEL_NBR = B.PARCEL_NBR AND
       (A.APPLICATION_STATUS IS NULL OR B.APPLICATION_STATUS = 'Registered');

【讨论】:

    【解决方案2】:

    我不确定 A_TABLE 在其中扮演什么角色,但这可能会给你你想要的:

    update B_TABLE
       set record_Status = 'I'
         , application_status = 'Closed  - this record got updated'
     where record_status = 'A'
       and application_status = 'Registered'
       and record_id <> (select max(record_id)
                           from B_TABLE b
                          where b.parcel_nbr = B_TABLE.parcel_nbr
                            and b.record_status = 'A'
                            and b.application_status = 'Registered');
    

    【讨论】:

    • 你好,戈登和哨兵。感谢您分享您的想法和帮助。我将努力使您的查询适应我的查询,看看我是否可以使它工作。我会尽快报告。谢谢。
    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多