从左连接SQL获取最大TransactionId

从左连接SQL获取最大TransactionId,sql,sql-server,Sql,Sql Server,您好,我在sql server中有一个sql查询 SELECT DTST.[Id], FPT.[StartTime], --FPT.[BusinessTypeId], FPT.[PaymentMethodId], FPT.[3DSecureId], FPT.[ProductId], DPT.[Id], FP

您好,我在sql server中有一个sql查询

SELECT
            DTST.[Id],
            FPT.[StartTime],
            --FPT.[BusinessTypeId],
            FPT.[PaymentMethodId],
            FPT.[3DSecureId],
            FPT.[ProductId],
            DPT.[Id],
            FPT.[TransactionStatusId],
            FPT.[Amount],
            DC.[Code],
            FPT.[PlayerId],
            DPL.[SourceOrigId],
            DPL.[Username],
            DPL.[FirstName],
            DPL.[LastName],
            DPL.[BrandId],
            DPL.[VIPLevelId],
            DPL.[MarketingChannelId],
            DPL.[MarketingSourceId],
            FPT.[PaymentReasonTextId],
            FPT_Ref.[PaymentReasonTextId],
            AD.Username,
            FPT.[OriginalTransactionId],
            FPT.[TransactionId],
            FPT_Ref.[OriginalTransactionId],
            FPT.[ProviderTransactionOrigId]
        FROM WarehouseMgmt.FactPaymentTrans AS FPT      
      JOIN 
      (
            SELECT TransactionId,MAX(TransactionStepId) TransactionStepId
            FROM [WarehouseMgmt].[FactPaymentTrans] 
            WHERE FactType = ''SOURCE'' 
            GROUP BY TransactionId 
      ) AS FPT_Last ON FPT.TransactionId = FPT_Last.TransactionId AND FPT.TransactionStepId = FPT_Last.TransactionStepId
        JOIN WarehouseMgmt.DimTransactionStepType AS DTST ON FPT.[TransactionStepTypeId] = DTST.[Id] 
        JOIN WarehouseMgmt.DimCurrency AS DC ON FPT.CurrencyId = DC.Id 
        JOIN WarehouseMgmt.DimPlayer AS DPL ON FPT.PlayerId = DPL.Id
        JOIN WarehouseMgmt.DimProduct AS DP ON DP.Id = FPT.ProductId
        JOIN WarehouseMgmt.DimProductType AS DPT ON DPT.Id = DP.ProductTypeId
        JOIN [WarehouseMgmt].[DimLoyaltyProgramLevel] DLPL ON DLPL.[Id]=DPL.VipLevelId
        JOIN WarehouseMgmt.DimAdmin AS AD ON AD.Id=FPT.CreatedByAdminId
        JOIN WarehouseMgmt.DimPaymentTransactionBusinessType AS DPTBT ON DPTBT.Id = FPT.BusinessTypeId
        JOIN WarehouseMgmt.DimTransactionStatus TS ON TS.Id= FPT.TransactionStatusId
        JOIN WarehouseMgmt.DimPaymentMethod DPM ON DPM.Id = FPT.[PaymentMethodId]
        JOIN WarehouseMgmt.DimTimeZone DTZ on  FPT.[TimeId] = DTZ.TimeUTCId
        LEFT JOIN [WarehouseMgmt].[FactPaymentTrans] FPT_Ref ON FPT_Ref.OriginalTransactionId = FPT.TransactionId AND FPT_Ref.FactType = ''SOURCE''       
        WHERE (FPT.FactType = ''SOURCE'') 
        AND DTZ.TimeId BETWEEN @DimStartDate AND @DimEndDate ' + @sqlFilters

在这个查询中,由于左连接,我有重复的事务。如何改进我的左联接,使其仅从左联接中获取最大TransactionId?

您能否简化问题并尝试窗口功能?如果不了解您的数据/架构,很难判断。也许你可以手写一个简单的例子,用更少的表格来解释到底发生了什么错误。如果FPT_Ref中存在匹配项或不存在匹配项,则outter join将返回结果。顺便说一句,[OriginalTransactionId]是您返回的唯一Trans Id,并且与outter join谓词中使用的列相同