2014-09-12 99 views
0

我有一個查詢返回多個日期的數據。僅返回數據集中的最新記錄

我想與在該領域的最近日期只返回記錄SAPOD(日期其實CYYMMDD其中C = 2000和1 2000年後0之前和YYYYMMDD使用SAPOD=Case when LEFT(SAPOD,1)=1 then '20' else '19' end + SUBSTRING(cast(sapod as nvarchar(7)),2,7)我可以證明這一點)

這裏是我的查詢:

SELECT GFCUS, Ne.NEEAN, SCDLE, SAPOD, SATCD,CUS.GFCUN, BGCFN1, 
    BGCFN2, BGCFN3, SV.SVCSA, SV.SVNA1, SV.SVNA2, SV.SVNA3, 
    SV.SVNA4, SV.SVNA5, SV.SVPZIP, SV.NONUK 
FROM SCPF ACC 
    INNER JOIN GFPF CUS ON GFCPNC = SCAN 
    LEFT OUTER JOIN SXPF SEQ ON SXCUS = GFCUS AND SXPRIM = '' 
    LEFT OUTER JOIN SVPFClean SV ON SVSEQ = SXSEQ 
    LEFT OUTER JOIN BGPF ON BGCUS = GFCUS AND BGCLC = GFCLC 
    LEFT OUTER JOIN NEPF NE ON SCAB=NE.NEAB and SCAN=ne.NEAN and SCAS=ne.NEAS 
    LEFT OUTER JOIN SAPF SA ON SCAB=SAAB and SCAN=SAAN and SCAS=SAAS 
WHERE 
    (SATCD>500 and 
    scsac='IV' and 
    scbal = 0 and 
    scai30<>'Y' and 
    scai14<>'Y' and 
    not exists(select * from v5pf where v5and=scan and v5bal<>0)) 
GROUP BY GFCUS, Ne.NEEAN, SCDLE, SAPOD, SATCD, 
    CUS.GFCUN, BGCFN1, BGCFN2, BGCFN3, SV.SVCSA, 
    SV.SVNA1, SV.SVNA2, SV.SVNA3, SV.SVNA4, SV.SVNA5, SV.SVPZIP, SV.NONUK 
ORDER BY MAX(SCAN) ASC, SAPOD DESC 

我得到的結果類似下面那裏有一個客戶聯繫多次交易,而我們只想顯示最近的交易數據:

picture of results in Excel

那麼我怎樣才能顯示最近的交易?這是我應該使用OUTER APPLY還是CROSS APPY

編輯:

對不起,我要澄清,我需要的最近的每個領域NEEAN獨特的記錄日期是帳戶數

+1

我覺得您所有的查詢需求是'極限1'。糟糕SqlServer警報!取而代之的是「Top 1」。 – venkatKA 2014-09-12 11:06:21

+1

我想這會是'SELECT TOP 1 ...' – Bulat 2014-09-12 11:07:33

+0

你能提供樣本數據和預期結果 – Bulat 2014-09-12 11:10:54

回答

1

您可以使用ROW_NUMBER()如下:

SELECT 
    ROW_NUMBER() OVER (PARTITION BY Ne.NEEAN ORDER BY SAPOD DESC) AS [Row], 
    GFCUS, Ne.NEEAN, SCDLE, SAPOD, SATCD,CUS.GFCUN, BGCFN1, 
    BGCFN2, BGCFN3, SV.SVCSA, SV.SVNA1, SV.SVNA2, SV.SVNA3, 
    SV.SVNA4, SV.SVNA5, SV.SVPZIP, SV.NONUK 
FROM SCPF ACC 
    INNER JOIN GFPF CUS ON GFCPNC = SCAN 
    LEFT OUTER JOIN SXPF SEQ ON SXCUS = GFCUS AND SXPRIM = '' 
    LEFT OUTER JOIN SVPFClean SV ON SVSEQ = SXSEQ 
    LEFT OUTER JOIN BGPF ON BGCUS = GFCUS AND BGCLC = GFCLC 
    LEFT OUTER JOIN NEPF NE ON SCAB=NE.NEAB and SCAN=ne.NEAN and SCAS=ne.NEAS 
    LEFT OUTER JOIN SAPF SA ON SCAB=SAAB and SCAN=SAAN and SCAS=SAAS 
WHERE 
    (SATCD>500 and 
    scsac='IV' and 
    scbal = 0 and 
    scai30<>'Y' and 
    scai14<>'Y' and 
    not exists(select * from v5pf where v5and=scan and v5bal<>0)) and 
    [Row] = 1 
GROUP BY GFCUS, Ne.NEEAN, SCDLE, SAPOD, SATCD, 
    CUS.GFCUN, BGCFN1, BGCFN2, BGCFN3, SV.SVCSA, 
    SV.SVNA1, SV.SVNA2, SV.SVNA3, SV.SVNA4, SV.SVNA5, SV.SVPZIP, SV.NONUK 
ORDER BY MAX(SCAN) ASC 

如果您不想返回[Row]列,可以將其封裝在子查詢中。

+0

對不起,我應該澄清一點,我需要在'NEEAN'字段中的每個唯一記錄的最近日期,這是帳號 – 2014-09-12 11:21:09

+0

@菲利普修正答案使用ROW_NUMBER() – 2014-09-12 11:30:21

+0

我認爲它必須封裝在一個子查詢或派生表,否則有一個*無效列[行] *編譯e error – 2014-09-12 11:31:32

1

您可以將用戶ROW_NUMBER讓每個客戶

前1行的where子句需要返回與POS值值1個

樣本查詢

row_number() over (partition by GFCUS order by SAPOD desc) as pos