仅返回数据集中的最新记录

时间:2014-09-12 11:03:33

标签: sql tsql sql-server-2008-r2

我有一个查询返回几个日期的数据。

我想仅返回SAPOD字段中最近日期的记录(日期实际上是CYYMMDD,其中C = 0之前的2000和2000之后的1,我可以使用SAPOD=Case when LEFT(SAPOD,1)=1 then '20' else '19' end + SUBSTRING(cast(sapod as nvarchar(7)),2,7)将其显示为YYYYMMDD)< / p>

这是我的查询:

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中每个唯一记录的最新日期,即帐号

2 个答案:

答案 0 :(得分: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]列,可以将其封装在子查询中。

答案 1 :(得分:1)

您可以使用row_number获得每位客户的前1行

在where子句中需要返回pos值为1的值

示例查询

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