【问题标题】:Delete duplicate records in the final output删除最终输出中的重复记录
【发布时间】:2021-06-16 13:04:43
【问题描述】:

我正在使用以下查询来输出结果。这只是一个帐户的示例。 对于此帐户 abc,我在输出中看到重复记录。见下文。 仅当所有列中的值重复时才需要删除记录。如果有超过 2 个重复,我只想保留第一个唯一记录并删除其余记录。

有人可以帮助修改此代码以获得所需的输出。

SELECT
    T.AccountId
    , CASE WHEN T.Status in (3,4,5,6) then -Amount else Amount end as Payment_Amount
    , DATEADD(hh,11,T.CreatedTimestamp) AS PaymentDate
    , CASE WHEN T.[ReferenceNumber] LIKE '%card%' THEN 'Card'
      WHEN T.[ReferenceNumber] LIKE '%bank%' THEN 'Bank'
      ELSE 'BPay'
      END AS PaymentType
    , CASE
      WHEN T.Status = 2 THEN 'Captured'
      WHEN T.Status = 5 THEN 'Refunded'
      WHEN T.Status = 6 THEN 'Dishonoured'
      ELSE 'Unknown'
      END AS [Status]
FROM (
    SELECT
        p.* ,
        ps.status,
        ROW_NUMBER() OVER (PARTITION BY ps.paymentid ORDER BY ps.createdtimestamp DESC) AS rno
    FROM table1 p
    INNER JOIN table2 ps on p.id = ps.PaymentId
    INNER JOIN (
        SELECT
            a.id AS accountid,
            th.id,
            th.TimeStamp
        FROM table3 a
        INNER JOIN table4 th on a.Id=th.AccountId and th.Type=39
    ) w 
    on p.AccountId=w.accountId and p.CreatedTimestamp>=w.timestamp
    WHERE
        DATEADD(hh,11,P.CreatedTimestamp) >= @startDate and DATEADD(hh,11,P.CreatedTimestamp) < @endDate
) T
WHERE accountid = abc
and Status in (2,5,6)

【问题讨论】:

  • 请发布一个最小的问题和查询。
  • 我已经添加了我正在使用的查询。我只希望最终输出没有重复。
  • 请不要将图像用于数据...使用格式化文本。当蒂姆说最小时,他的意思不是您的完整查询,而是您可以提出的显示类似问题的尽可能小的查询。你真正的查询太复杂了,任何人都无法考虑。
  • 您的结果中没有足够的信息来决定保留哪些行。您的(未使用的)行号几乎就在那里,您显然需要每组行的最新行,但是定义每组的内容,如果没有描述,您的逻辑不清楚,因为根据 PaymentType,底部两行不是重复的.
  • 您使用通用名称混淆了有关您的架构的所有有用线索。简短的回答是要么您的数据有缺陷(不太可能),要么您的查询在某种方式上存在逻辑缺陷(很可能)。您需要将其拆开并找出它产生重复行的原因。我看到 ROW_NUMBER 但没有使用生成的值 - 也许这是你的问题?您的 DATEADD 使用情况令人担忧 - 这不是您调整本地/UTC 时间的方式。注意状态值的不一致 - 代码需要好好审查。

标签: sql sql-server tsql duplicates


【解决方案1】:
SELECT DISTINCT T.AccountId ...

是您最快的解决方案,从最终输出中消除重复行(基于所有列值相同)。但是,DISTINCT 并不总是理想的方法(它通常是一个大锤子,可能是一个小钉子),并且可能会影响性能。您的查询中显然有许多不同的表(别名为“T”),需要更好地了解这些表中记录的确切发生方式才能更好地优化此查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2020-07-16
    • 2021-02-13
    相关资源
    最近更新 更多