【发布时间】: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