根据ROW_NUMBER高于1的结果进行过滤

时间:2018-04-30 10:45:06

标签: sql sql-server filtering row-number

我设法使用ROW_NUMBER()获取一些有序结果,并按国家/地区代码和客户参考进行分区,按报价日期排序。 ROW_NUMBER()列称为PRank。

CountryCode  ¦   ClientRef   ¦   Quote Ref   ¦   Name     ¦    Address     ¦   PostCode   ¦   PreferencesCode   ¦   QuoteDate         ¦   PolicyType   ¦   PRank   ¦
     0           AABB001         AABB001MB1    Mr A Smith   1 Country Lane     WA21 2PU       5934611             2017-03-18 00:00:00     MB               1
     0           AABB001         AABBMM1MB2    Mr A Smith   1 Country Lane     WA21 2PU       5934611             2017-03-18 00:00:00     MB               2
     0           AABB001         AABBMM1MB3    Mr A Smith   1 Country Lane     WA21 2PU       5934611             2017-03-18 00:00:00     MB               3
     0           BBGG003         BBGG003MB1    Mrs B Jones  2 City Road        M1 3XY         312191              2017-09-02 00:00:00     MB               1

这是我的ROW_NUMBER()列的代码:

ROW_NUMBER() OVER(PARTITION BY CountryCode, ClientRef, QuoteDate 
                  ORDER BY QuoteDate DESC, PolicyRef asc)

有很多结果,比如最后一行;它们只计为1,因为客户在相关日期只有一个报价。我希望消除那些行而不从客户结果中删除任何行,其中多个引号出现在同一日期(即我仍然希望在上面的结果中看到第一个客户的所有三行)所以我想通过使用CTE和过滤在ROW_NUMBER上会导致我丢失我仍然需要查看的结果中的数据。

我试图用HAVING做一些事情并总结PRank专栏,但我无法弄清楚分组,因为我不想实际聚合数据,只是去除ClientRef中的任何行每天只有一个QuoteRef。

2 个答案:

答案 0 :(得分:2)

如果您在一天内寻找超过1个报价的客户,那么CTE仍然是最好的方式。

假设这是针对InfocentrePlus中的ic_dapolicy视图(这显然是OpenGI数据,并且icp表并不易于使用),那么您的查询将类似于:< / p>

WITH Quotes AS(
    SELECT *,
           COUNT(*) OVER (PARTITION BY PPY.B@, PPY.Ref@) AS ClientQuotes 
    FROM ic_Dapolicy PPY
    WHERE PPY.Quote_date = @Quote_date) --If you aren't filtering on Quote_date in your where, add it to the PARTITION BY clause
SELECT [YourColumns]
FROM Quotes
WHERE ClientQuotes > 1;

答案 1 :(得分:1)

我认为您需要以下内容。

COUNT()

另一个更简单的变体是使用窗口;WITH Rankings AS ( -- Your query here SELECT CountryCode = 1, ClientRef = 1, QuoteDate = 1, PRank = 1, Total = COUNT(1) OVER (PARTITION BY CountryCode, ClientRef, QuoteDate) ) DELETE D FROM Rankings AS D WHERE D.Total = 1

{{1}}