2014-09-12 55 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