1527. 患某种疾病的患者
1527. 患某种疾病的患者
题目
Table: Patients
+--------------+---------+ | Column Name | Type | +--------------+---------+ | patient_id | int | | patient_name | varchar | | conditions | varchar | +--------------+---------+
patient_id is the primary key (column with unique values) for this table.
'conditions' contains 0 or more code separated by spaces.
This table contains information of the patients in the hospital.
Write a solution to find the patient_id, patient_name, and conditions of the patients who have Type I Diabetes. Type I Diabetes always starts with DIAB1
prefix.
Return the result table in any order.
The result format is in the following example.
Example 1:
Input:
Patients table:
+------------+--------------+--------------+ | patient_id | patient_name | conditions | +------------+--------------+--------------+ | 1 | Daniel | YFEV COUGH | | 2 | Alice | | | 3 | Bob | DIAB100 MYOP | | 4 | George | ACNE DIAB100 | | 5 | Alain | DIAB201 | +------------+--------------+--------------+
Output:
+------------+--------------+--------------+ | patient_id | patient_name | conditions | +------------+--------------+--------------+ | 3 | Bob | DIAB100 MYOP | | 4 | George | ACNE DIAB100 | +------------+--------------+--------------+
Explanation: Bob and George both have a condition that starts with DIAB1.
题目大意
患者信息表: Patients
+--------------+---------+ | Column Name | Type | +--------------+---------+ | patient_id | int | | patient_name | varchar | | conditions | varchar | +--------------+---------+
在 SQL 中,patient_id (患者 ID)是该表的主键。
'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。
查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1
。
按 任意顺序 返回结果表。
查询结果格式如下示例所示。
示例 1:
输入: Patients 表:
+------------+--------------+--------------+ | patient_id | patient_name | conditions | +------------+--------------+--------------+ | 1 | Daniel | YFEV COUGH | | 2 | Alice | | | 3 | Bob | DIAB100 MYOP | | 4 | George | ACNE DIAB100 | | 5 | Alain | DIAB201 | +------------+--------------+--------------+
输出:
+------------+--------------+--------------+ | patient_id | patient_name | conditions | +------------+--------------+--------------+ | 3 | Bob | DIAB100 MYOP | | 4 | George | ACNE DIAB100 | +------------+--------------+--------------+
解释: Bob 和 George 都患有代码以 DIAB1 开头的疾病。
解题思路
MySQL
返回字段:
使用SELECT
返回patient_id
、patient_name
和conditions
。筛选条件:
- 使用
LIKE
运算符,匹配conditions
列中包含以DIAB1
开头的疾病代码。 - 条件为:
conditions LIKE 'DIAB1%' OR conditions LIKE '% DIAB1%'
。
- 使用
复杂度分析
- 时间复杂度:
O(n)
,假设表中有n
条记录,LIKE
运算符会对每条记录扫描并匹配子字符串。 - 空间复杂度:SQL 查询本身不占用额外空间,返回的结果占用的空间与记录数成正比。
Pandas
加载数据:
将Patients
表加载到 Pandas 的DataFrame
中。筛选条件:
- 使用 Pandas 的
str.contains()
方法,筛选conditions
列中包含以DIAB1
开头的疾病代码的记录。 - 正则表达式:
r'(^| )DIAB1'
匹配以DIAB1
开头的单词。
- 使用 Pandas 的
返回结果:
- 保留符合条件的记录,返回所有列。
代码
SELECT patient_id, patient_name, conditions
FROM Patients
WHERE conditions LIKE 'DIAB1%' OR conditions LIKE '% DIAB1%'
import pandas as pd
def find_diabetes_patients(patients: pd.DataFrame) -> pd.DataFrame:
# 筛选包含 DIAB1 的记录
return patients[patients['conditions'].str.contains(r'(^| )DIAB1', na=False)]