【发布时间】:2014-11-06 13:08:12
【问题描述】:
我有一个查询返回多个日期的数据。
我只想返回字段 SAPOD 中具有最近日期的记录(日期实际上是 CYYMMDD,其中 C=0 之前 2000 年和 1 之后 2000 年,我可以使用 SAPOD=Case when LEFT(SAPOD,1)=1 then '20' else '19' end + SUBSTRING(cast(sapod as nvarchar(7)),2,7) 将其显示为 YYYYMMDD)
这是我的查询:
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
我得到如下结果,其中一个客户有几笔交易,我们只想显示最近一次交易的数据:
那么我怎样才能只显示最近的交易呢?这是我应该使用OUTER APPLY 或CROSS APPY 的情况吗?
编辑:
抱歉,我需要澄清一下,我需要字段 NEEAN 中每个唯一记录的最新日期,即帐号
【问题讨论】:
-
我认为您的所有查询需求都是
LIMIT 1。糟糕,SqlServer 警报!Top 1代替。 -
我猜应该是
SELECT TOP 1 ... -
能否提供样本数据和预期结果
-
嗯,上图中我只想要记录2,也就是最近的日期。
-
您需要将其包含在列列表 row_number() over(按 GFCUS 顺序按 SAPOD 分区)作为 pos 并在 where 子句中使用条件来返回值 where pos =1 ,所以你会得到每个客户 1 条最新记录
标签: sql tsql sql-server-2008-r2