根据多个条件使用 RowNumber 应用排名

Apply rank using RowNumber based on multiple conditions

在这里寻找一些关于我目前正在进行的项目的建议。 我有一个 table 包括
车辆名称
合约数量
销售额
比率

我想根据特定条件向 table 添加行号。

  1. 如果有 5 辆或更多车辆 Ratio = 0,则 RowNumber() OVER Order By Sale Amount但仅应用 Ratio = 0

    "everything else" RowNumber() OVER Order By Ratio[=60 的行号=]

    我希望行号在将行号应用于 "everything else" 时继续,而不是从头开始。因此,如果满足条件,则应用 RowNumber,其中 Ratio = 0 使用 Sale Amount。根据比率对其余部分进行排序。行号必须连续且不能重新开始。

    如果上述条件失败,则只需使用 RowNumber() Over Order By Ratio

我在这里基本上想做的是在第一个失败的情况下添加第二个排名条件。因此,如果条件 1 失败,则在第二个条件下排名。

我会粘贴一个 table 但我才意识到在这里得到一个 table 是多么复杂。抱歉!

这是我尝试过但没有成功的示例。无论 case 语句是否为真,它都会使用 Ratio 继续应用行号。

Select 
,ROW_NUMBER() 
OVER 
(ORDER BY 
    (CASE WHEN SUM(CASE WHEN RATIO = 0 THEN 1 ELSE 0 END) >= 5
          THEN Sale_Amount 
          ELSE Ratio END) ASC
    )as Rows1
FROM Table

不确定 RowNumber() 在这种情况下是否最好。

任何答案或提示都会有所帮助!提前致谢!

这是显示我的数据的尝试:

原始数据集:

+---------+----------------+-------------+--------+  
| Vehicle | # of Contracts | Sale Amount | Ratio  |  
+---------+----------------+-------------+--------+  
| A       |              1 | 0        | 0.00%  |  
| B       |              1 | 0        | 0.00%  |  
| C       |              1 | 8        | 0.00%  |  
| D       |              4 | ,069      | 0.00%  |  
| E       |              2 | ,600      | 0.00%  |  
| F       |              6 | ,210      | 0.00%  |  
| G       |              3 | ,289      | 0.00%  |  
| H       |              5 | ,590      | 0.00%  |  
| I       |             10 | ,456      | 13.45% |  
| J       |             12 | ,000      | 10.56% |  
| K       |              6 | ,458      | 20.00% |  
| L       |              9 | ,607      | 34.50% |  
| M       |             10 | ,987      | 70.80% |  
| N       |              2 | 4        | 96.89% |  
| O       |              2 | 0        | 34.67% |  
| P       |              3 | 0        | 23.09% |  
| Q       |              5 | 1        | 12.78% |  
| R       |              7 | ,008      | 45.78% |  
| T       |              9 | 5        | 20.00% |  
| U       |              2 | 5        | 1.00%  |  
| V       |              4 | 4        | 45.00% |  
+---------+----------------+-------------+--------+ 

预期结果:

+-----------+---------+----------------+-------------+--------+  
| RowNumber | Vehicle | # of Contracts | Sale Amount | Ratio  |  
+-----------+---------+----------------+-------------+--------+  
|         1 | F       |              6 | ,210      | 0.00%  |  
|         2 | H       |              5 | ,590      | 0.00%  |  
|         3 | D       |              4 | ,069      | 0.00%  |  
|         4 | G       |              3 | ,289      | 0.00%  |  
|         5 | E       |              2 | ,600      | 0.00%  |  
|         6 | A       |              1 | 0        | 0.00%  |  
|         7 | B       |              1 | 0        | 0.00%  |  
|         8 | C       |              1 | 8        | 0.00%  |  
|         9 | U       |              2 | 5        | 1.00%  |  
|        10 | J       |             12 | ,000      | 10.56% |  
|        11 | Q       |              5 | 1        | 12.78% |  
|        12 | I       |             10 | ,456      | 13.45% |  
|        13 | K       |              6 | ,458      | 20.00% |  
|        14 | T       |              9 | 5        | 20.00% |  
|        15 | P       |              3 | 0        | 23.09% |  
|        16 | L       |              9 | ,607      | 34.50% |  
|        17 | O       |              2 | 0        | 34.67% |  
|        18 | V       |              4 | 4        | 45.00% |  
|        19 | R       |              7 | ,008      | 45.78% |  
|        20 | M       |             10 | ,987      | 70.80% |  
|        21 | N       |              2 | 4        | 96.89% |  
+-----------+---------+----------------+-------------+--------+  

我认为您的示例输出与您所说的不符,因此可能需要调整 ORDER BY 字段,但我认为这就是您所追求的:

;with cte AS (SELECT *,COUNT(*) OVER(PARTITION BY Ratio) AS Ratio_CT 
              FROM Table1
              )
SELECT *,ROW_NUMBER() OVER(ORDER BY CASE WHEN Ratio_CT >= 5 AND Ratio = 0 THEN [Sale Amount] END DESC,Ratio) AS Rows1
FROM cte

演示:SQL Fiddle

您可以使用 SUM OVER()ROW_NUMBER()

根据您的结果,我按合同数量 DESC 对第一个条件进行排序。

SQL Fiddle

WITH Cte AS(
    SELECT *,
        ZeroRatio = SUM(CASE WHEN Ratio = 0 THEN 1 ELSE 0 END) OVER()
    FROM TestData
),
CteRN AS(
    SELECT *,
        RN = ROW_NUMBER() OVER(ORDER BY 
            CASE WHEN ZeroRatio >= 5 AND Ratio = 0 THEN NumContracts END DESC,
            Ratio
        )
    FROM Cte
)
SELECT
    RN, Vehicle, NumContracts, SaleAmount, Ratio
FROM CteRN
ORDER BY RN