【问题标题】:returning only the most recent record in dataset仅返回数据集中的最新记录
【发布时间】: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 APPLYCROSS 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


【解决方案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] 列,可以将其封装在子查询中。

【讨论】:

  • 对不起,我需要澄清一下,我需要 NEEAN 字段中每个唯一记录的最近日期,即帐号
  • @Philip 修改答案以使用 ROW_NUMBER()
  • 我认为它必须封装在子查询或派生表中,否则会出现invalid column [Row]编译错误
  • 请删除显示使用“Top 1”的代码 - 然后我可以接受您的回答作为解决问题
  • @Philip TOP 1 答案现已删除
【解决方案2】:

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

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

示例查询

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

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多