2017-06-21 79 views
0

编辑:下面是我正在使用的数据。我写的查询给出了基于OCCPSTAT字段的重复数据(最右边的数据列,C或N)。需要帮助撰写查询。

我需要一个查询来拉出最接近我定义日期的记录(代码是这样),但是,如果有记录的C和N副本,我只需要N记录。

5000 1000 D001 RNT 100 11/1/2014 0:00 C 
5000 1000 D001 GAS 200 11/1/2014 0:00 C 
5000 1000 D001 ELC 300 11/1/2014 0:00 C 
5000 1000 D001 WAT 400 11/1/2014 0:00 C 
5000 1000 D001 TAX 500 11/1/2014 0:00 C 
5000 1000 D001 INS 600 11/1/2014 0:00 C 
5000 1000 D001 RNT 200 11/1/2015 0:00 C 
5000 1000 D001 GAS 300 11/1/2015 0:00 C 
5000 1000 D001 ELC 400 11/1/2015 0:00 C 
5000 1000 D001 WAT 500 11/1/2015 0:00 C 
5000 1000 D001 TAX 600 11/1/2015 0:00 C 
5000 1000 D001 INS 700 11/1/2015 0:00 C 
5000 1000 D001 RNT 300 11/1/2016 0:00 C 
5000 1000 D001 GAS 400 11/1/2016 0:00 C 
5000 1000 D001 ELC 500 11/1/2016 0:00 C 
5000 1000 D001 WAT 600 11/1/2016 0:00 C 
5000 1000 D001 TAX 700 11/1/2016 0:00 C 
5000 1000 D001 INS 800 11/1/2016 0:00 C 
5000 1000 D001 RNT 500 11/1/2017 0:00 C 
5000 1000 D001 GAS 600 11/1/2017 0:00 C 
5000 1000 D001 ELC 700 11/1/2017 0:00 C 
5000 1000 D001 WAT 800 11/1/2017 0:00 C 
5000 1000 D001 TAX 900 11/1/2017 0:00 C 
5000 1000 D001 INS 100011/1/2017 0:00 C 
5000 1000 D001 RNT 100 11/1/2014 0:00 N 
5000 1000 D001 GAS 200 11/1/2014 0:00 N 
5000 1000 D001 ELC 300 11/1/2014 0:00 N 
5000 1000 D001 WAT 400 11/1/2014 0:00 N 
5000 1000 D001 TAX 500 11/1/2014 0:00 N 
5000 1000 D001 INS 600 11/1/2014 0:00 N 
5000 1000 D001 RNT 200 11/1/2015 0:00 N 
5000 1000 D001 GAS 300 11/1/2015 0:00 N 
5000 1000 D001 ELC 400 11/1/2015 0:00 N 
5000 1000 D001 WAT 500 11/1/2015 0:00 N 
5000 1000 D001 TAX 600 11/1/2015 0:00 N 
5000 1000 D001 INS 700 11/1/2015 0:00 N 
5000 1000 D001 RNT 300 11/1/2016 0:00 N 
5000 1000 D001 GAS 400 11/1/2016 0:00 N 
5000 1000 D001 ELC 500 11/1/2016 0:00 N 
5000 1000 D001 WAT 600 11/1/2016 0:00 N 
5000 1000 D001 TAX 700 11/1/2016 0:00 N 
5000 1000 D001 INS 800 11/1/2016 0:00 N 
5000 1000 D001 RNT 500 11/1/2017 0:00 N 
5000 1000 D001 GAS 600 11/1/2017 0:00 N 
5000 1000 D001 ELC 700 11/1/2017 0:00 N 
5000 1000 D001 WAT 800 11/1/2017 0:00 N 
5000 1000 D001 TAX 900 11/1/2017 0:00 N 
5000 1000 D001 INS 1000 11/1/2017 0:00 N 

查询是:

SELECT 
    BLDGID, 
    LEASID, 
    SUITID, 
    INCCAT, 
    AMOUNT, 
    EFFDATE, 
    OCCPSTAT 

FROM( 
    SELECT 
    CM.BLDGID, 
    CM.LEASID, 
    LS.SUITID, 
    CM.INCCAT, 
    CM.AMOUNT, 
    CM.EFFDATE, 
    LS.OCCPSTAT, 
ROW_NUMBER() OVER(PARTITION BY CM.BLDGID, CM.LEASID, LS.SUITID, CM.INCCAT, LS.OCCPSTAT 
ORDER BY CM.EFFDATE DESC) AS rowno 

FROM SQLDATA.DBO.CMRECC CM INNER JOIN SQLDATA.DBO.LEAS LS ON CM.LEASID = LS.LEASID 
WHERE (CM.EFFDATE < '20170601') AND (CM.BLDGID = '85000') AND (LS.OCCPSTAT = 'C' OR LS.OCCPSTAT = 'N') 


) AS d 
WHERE rowno = 1 
+0

因为案件正在同一行你不能用'Case'做,但你要检查的结果集,并看到,如果相同的记录存在与C和N然后只返回N,对吗? – RezaRahmati

+0

@RezaRahmati,这正是我想要做的。 – SQLISHARD

回答

1

你不需要为这个case。一种方法是跟踪每个组的occpstat列,然后应用where中的逻辑。

但是,我认为有一个更简单的解决方案。从partition by移动occpstatorder by和第一选择“N”值:

SELECT BLDGID, LEASID, SUITID, INCCAT, AMOUNT, EFFDATE, OCCPSTAT 
FROM (SELECT CM.BLDGID, CM.LEASID, LS.SUITID, CM.INCCAT 
      CM.AMOUNT, CM.EFFDATE, LS.OCCPSTAT, 
      ROW_NUMBER() OVER (PARTITION BY CM.BLDGID, CM.LEASID, LS.SUITID, CM.INCCAT 
           ORDER BY LS.OCCPSTAT DESC, CM.EFFDATE DESC) AS rownum 
    FROM SQLDATA.DBO.CMRECC CM INNER JOIN 
      SQLDATA.DBO.LEAS LS 
      ON CM.LEASID = LS.LEASID 
    WHERE CM.EFFDATE < '20170601' AND CM.BLDGID = '85000' AND 
      LS.OCCPSTAT IN ('C', 'N') 
    ) d 
WHERE rownum = 1 
+0

这将返回与删除错误后的结果完全相同的结果(在ORDER BY之前的额外逗号以及由于IN而导致的“d”之前需要第二个“)”。 即使首先有“N”个值,“C”仍然在数据集中,我不能重复其他字段(这是财务报告)。 – SQLISHARD