跳转至

3055. 最高欺诈百分位数 🔒

题目描述

表:Fraud

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| policy_id   | int     |
| state       | varchar |
| fraud_score | int     |
+-------------+---------+
policy_id 是这张表中具有不同值的列。
这张表包含 policy id,state 和 fraud score。

Leetcode 保险公司开发了一个 ML 驱动的 预测模型 来检测欺诈索赔的 可能性。因此,他们分配了经验最丰富的理赔员来处理前 5% 被标记 的索赔。

编写一个解决方案来找出 每个州 索赔的前 5 百分位数

返回结果表,以 state 升序 排序,fraud_score 降序 排序,policy_id 升序 排序。

结果格式如下所示。

 

示例 1:

输入:
Fraud 表:
+-----------+------------+-------------+
| policy_id | state      | fraud_score | 
+-----------+------------+-------------+
| 1         | California | 0.92        | 
| 2         | California | 0.68        |   
| 3         | California | 0.17        | 
| 4         | New York   | 0.94        | 
| 5         | New York   | 0.81        | 
| 6         | New York   | 0.77        |  
| 7         | Texas      | 0.98        |  
| 8         | Texas      | 0.97        | 
| 9         | Texas      | 0.96        | 
| 10        | Florida    | 0.97        |  
| 11        | Florida    | 0.98        | 
| 12        | Florida    | 0.78        | 
| 13        | Florida    | 0.88        | 
| 14        | Florida    | 0.66        | 
+-----------+------------+-------------+
输出: 
+-----------+------------+-------------+
| policy_id | state      | fraud_score |
+-----------+------------+-------------+
| 1         | California | 0.92        | 
| 11        | Florida    | 0.98        | 
| 4         | New York   | 0.94        | 
| 7         | Texas      | 0.98        |  
+-----------+------------+-------------+
解释:
- 对于 California 州,只有 ID 为 1 的保单的欺诈分数为 0.92,属于该州的前 5%。
- 对于 Florida 州,只有 ID 为 11 的保单的欺诈分数为 0.98,属于该州的前 5%。
- 对于 New York 州,只有 ID 为 4 的保单的欺诈分数为 0.94,属于该州的前 5%。
- 对于 Texas 州,只有 ID 为 7 的保单的欺诈分数为 0.98,属于该州的前 5%。
输出表以 state 升序排序,fraud_score 降序排序,policy_id 升序排序。

解法

方法一:使用窗口函数

我们可以使用 RANK() 窗口函数来计算每个州的欺诈分数的排名,然后筛选出排名为 1 的记录,并且按照题目要求排序。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Write your MySQL query statement below
WITH
    T AS (
        SELECT
            *,
            RANK() OVER (
                PARTITION BY state
                ORDER BY fraud_score DESC
            ) AS rk
        FROM Fraud
    )
SELECT policy_id, state, fraud_score
FROM T
WHERE rk = 1
ORDER BY 2, 3 DESC, 1;

评论