Tsql DISTINCT没有删除重复项
我不知道如何在AB-BA方式中使用DISTINCT。例如,我有两列BoughtLoyaltyProgramId,SoldLoyaltyProgramId。但是,即使我使用DISTINCT,当boughtloyaltyprogramid中的相同代码出现在soldloyaltyprogramid中时,它也会产生重复。我不想重复,但我不知道如何与多列和配对工作 以下是存储过程:Tsql DISTINCT没有删除重复项,tsql,Tsql,我不知道如何在AB-BA方式中使用DISTINCT。例如,我有两列BoughtLoyaltyProgramId,SoldLoyaltyProgramId。但是,即使我使用DISTINCT,当boughtloyaltyprogramid中的相同代码出现在soldloyaltyprogramid中时,它也会产生重复。我不想重复,但我不知道如何与多列和配对工作 以下是存储过程: ALTER PROC AA @LPPProgramID UNIQUEIDENTIFIER , @DateFr
ALTER PROC AA
@LPPProgramID UNIQUEIDENTIFIER ,
@DateFrom DATETIME ,
@DateTo DATETIME
AS
SELECT DISTINCT TOP ( 5 )
BoughtLoyaltyProgramId ,
SoldLoyaltyProgramId ,
DateTransactionCleared ,
ExchangeRate
FROM dbo.PEX_ClearedTransactions
WHERE DateTransactionCleared >= @DateFrom
AND DateTransactionCleared < @DateTo
AND ( BoughtLoyaltyProgramId = @LPPProgramID
OR SoldLoyaltyProgramId = @LPPProgramID
)
ORDER BY ExchangeRate;
GO
Distinct是每行的,因此行中列中的值是不同的组合,不会将行中每列中的数据与该行中的其他列进行比较
您可能还希望在Where语句中对列数据进行一些比较。以下是如何从两列中获取所有不同的值:
SELECT distinct * from
(SELECT BoughtLoyaltyProgramId
FROM dbo.PEX_ClearedTransactions
UNION ALL
SELECT SoldLoyaltyProgramId
FROM dbo.PEX_ClearedTransactions) as A
也许您想使用行号:
Distinct应用于您查询的所有列,而不仅仅是前2列。如果您考虑所有选定的列,它是否仍然包含重复数据?您可以显示查询结果吗?我不太明白发生了什么事。不清楚你在问什么。向我们展示一些示例数据以提供帮助。如果考虑所有列,则包含重复项。查询结果显示了大量购买的用户ID、SoldUserID、交换数据等等。如果你愿意,我可以得到准确的结果。我想你们说得最好,DISTINCT是每行,而不是每列,我希望所有列都没有重复,但我对TSQL还不够熟练,不知道如何做到这一点。丹尼斯,我昨天试过了,但没有成功。仍然显示Dues。显示你的意思是欺骗,我敢肯定它不会显示我认为是重复的。一个特定的用户名出现在出售,因为你既可以是航空公司点的买方和卖方。@ USER 2689499我想我现在明白了,看看我的编辑答案是否可以让你开始。谢谢你,丹尼斯,我会试试这个,但是你能帮我了解整个存储过程的语法吗?Tim没有办法把它作为存储过程来做吗?它必须是一个CTE?@user2689499:您可以在存储过程中使用CTE而不会出现问题。Tim,我想我要问的是存储过程中的整个语法。如果你能帮我的话,我会在哪里添加CTE,等等。你能帮我弄清楚整个语法吗?不到一年的时间,我对SQLL还很陌生,所以我有很多麻烦。
WITH cte
AS (SELECT boughtloyaltyprogramid,
soldloyaltyprogramid,
datetransactioncleared,
exchangerate,
RN=Row_number() OVER(
partition BY boughtloyaltyprogramid, soldloyaltyprogramid
ORDER BY exchangerate)
FROM dbo.pex_clearedtransactions
WHERE datetransactioncleared >= @DateFrom
AND datetransactioncleared < @DateTo
AND ( boughtloyaltyprogramid = @LPPProgramID
OR soldloyaltyprogramid = @LPPProgramID ))
SELECT TOP(5) * FROM cte
WHERE RN = 1
ORDER BY exchangerate