从相关表中加入最大日期

时间:2016-08-03 11:57:06

标签: sql sql-server join

我有以下疑问:

select AccountId
into #liveCustomers
from AccountExtensionBase where New_duos_group not in ('T053','T054')
and New_AccountStage = 7

select AccountId
into #customerWhoLeft
from New_marketmessagein as a
inner join AccountExtensionBase as b on a.new_accountmminid = b.AccountId
where New_MessageTypeCode = '105L'
and a.New_EffectiveFromDate > '30 jun 2016'
and b.New_duos_group not in ('T053','T054')

select 
      accountid
    , New_MPRNNumber
    , New_duos_group
    , New_CommercialAgreementDayRate
    , New_CommercialAgreementNightRate
    , New_CommercialAgreementHeatRate
    , New_Tariffpriceagreedatsignup
    , New_Tariffname 
into 
    #monthCustomers
from 
    AccountExtensionBase
where 
    AccountId in (select * from #customerWhoLeft) 
    or 
    AccountId in (select * from #liveCustomers)

我现在希望加入一个名为usagefactorExtensionBase的表,并且只加入包含最近读取日期的行,但是当我尝试将其加入到我的4985个月度客户表中时,我得到了106,813行使用此代码,所以我想我的加入或方法已经出错,有人可以帮我纠正错误,所以我显示monthCustomers列表加上他们最近阅读的阅读细节。

尝试:

select 
      accountid
    , New_MPRNNumber
    , New_duos_group
    , New_CommercialAgreementDayRate
    , New_CommercialAgreementNightRate
    , New_CommercialAgreementHeatRate
    , New_Tariffpriceagreedatsignup
    , New_Tariffname
    , max(b.New_EffectiveFromDate)
    , b.New_ActualUsageFactor
    , b.New_EstimatedUseage 
from 
    #monthCustomers as a
        left join 
    New_marketmessageinusagefactorExtensionBase as b 
        on a.AccountId = b.new_accountmmusagefactorid
group by 
      accountid
    , New_MPRNNumber
    , New_duos_group
    , New_CommercialAgreementDayRate
    , New_CommercialAgreementNightRate
    , New_CommercialAgreementHeatRate
    , New_Tariffpriceagreedatsignup
    , New_Tariffname
    , b.New_ActualUsageFactor
    , b.New_EstimatedUseage

1 个答案:

答案 0 :(得分:1)

试试这个,

SELECT
    accountid,
    New_MPRNNumber,
    New_duos_group,
    New_CommercialAgreementDayRate,
    New_CommercialAgreementNightRate,
    New_CommercialAgreementHeatRate,
    New_Tariffpriceagreedatsignup,
    New_Tariffname,
    b.New_EffectiveFromDate,
    b.New_ActualUsageFactor,
    b.New_EstimatedUseage
FROM #monthCustomers AS a
-- Get only max date rows for each AccountID
LEFT JOIN(  SELECT t1.* 
            FROM New_marketmessageinusagefactorExtensionBase AS t1 
            INNER JOIN (    SELECT new_accountmmusagefactorid, MAX(New_EffectiveFromDate) AS New_EffectiveFromDate_Max
                            FROM New_marketmessageinusagefactorExtensionBase
                            GROUP BY new_accountmmusagefactorid
                        ) AS t2 ON t2.new_accountmmusagefactorid = t1.new_accountmmusagefactorid
                            AND t2.New_EffectiveFromDate_Max = t1.New_EffectiveFromDate
            )AS b
    ON a.AccountId = b.new_accountmmusagefactorid

可能有相同日期的行,如果有效,请尝试以下

SELECT
    accountid,
    New_MPRNNumber,
    New_duos_group,
    New_CommercialAgreementDayRate,
    New_CommercialAgreementNightRate,
    New_CommercialAgreementHeatRate,
    New_Tariffpriceagreedatsignup,
    New_Tariffname,
    b.New_EffectiveFromDate,
    b.New_ActualUsageFactor,
    b.New_EstimatedUseage
FROM #monthCustomers AS a
-- Get only max date rows for each AccountID
LEFT JOIN(  SELECT  New_MPRNNumber,
                    New_duos_group,
                    New_CommercialAgreementDayRate,
                    New_CommercialAgreementNightRate,
                    New_CommercialAgreementHeatRate,
                    New_Tariffpriceagreedatsignup,
                    New_Tariffname,
                    MAX(New_EffectiveFromDate) AS New_EffectiveFromDate,
                    New_ActualUsageFactor,
                    New_EstimatedUseage
            FROM New_marketmessageinusagefactorExtensionBase AS t1 
            GROUP BY
                    New_MPRNNumber,
                    New_duos_group,
                    New_CommercialAgreementDayRate,
                    New_CommercialAgreementNightRate,
                    New_CommercialAgreementHeatRate,
                    New_Tariffpriceagreedatsignup,
                    New_Tariffname,
                    New_ActualUsageFactor,
                    New_EstimatedUseage
            )AS b
    ON a.AccountId = b.new_accountmmusagefactorid