SSMS Rank()函数。如何按一系列值而不是精确值进行分区?

时间:2016-07-18 13:58:14

标签: sql sql-server ssms

我在某些sql代码中使用了rank()和row_number()函数。一切都工作正常,除了我有[np_Exposure_Total]值为20134446与20134447的记录的部分。我希望这些基本上被视为它们是相同的数字。理想情况下,我想通过像是在正或负3之内,或者在乘以或除以1.05之类的东西来做。

在我的下面的代码中,如果是这种情况,row_number函数将从1开始并且不继续将下一个计数为3,并且在rank函数中它不会将它们排序为好像它们是同一分组的一部分。

SELECT [account_ID]
      ,[np_Country]
      ,[np_NAICS]
      ,[np_Exposure_Total]
      ,[lookup]
      ,[NAICS]
      ,[NAICS Description]
      ,[Indigenous Prods]
      ,rank() over (Partition by [account_ID], [np_Country], [np_Exposure_Total] ORDER BY [Indigenous Prods] asc) as Ind_Rank
      ,Row_Number() over (Partition by [account_ID], [np_Country], [np_Exposure_Total] ORDER BY [Indigenous Prods] asc) as Ind_Row
  FROM [Null_Limits].[dbo].[Variable to Risk Code Link]
  ORDER BY [account_ID] asc

我的输出是 Sample Output

1 个答案:

答案 0 :(得分:2)

使用case

  rank() over (Partition by [account_ID], [np_Country],
                            (case when [np_Exposure_Total] in (20134446, 20134447) then 20134446
                                  else np_Exposure_Total
                             end)
               ORDER BY [Indigenous Prods] asc
               ) as Ind_Rank

不要开始摆弄这些值(通过做floor(np_Exposure_Total*1.0001)之类的事情),因为这可能会对其他值产生意想不到的副作用。如果您希望所有值的逻辑彼此接近,则只放入这样的表达式。