From e3e3e5f288d2e2e3840829ca10e78f494ffa4d53 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Fri, 17 Jan 2025 02:07:13 +0200 Subject: [PATCH 1/5] Added task 3421 --- .../readme.md | 65 +++++++++++++++++ .../script.sql | 16 ++++ .../MysqlTest.java | 73 +++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 src/main/java/g3401_3500/s3421_find_students_who_improved/readme.md create mode 100644 src/main/java/g3401_3500/s3421_find_students_who_improved/script.sql create mode 100644 src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java diff --git a/src/main/java/g3401_3500/s3421_find_students_who_improved/readme.md b/src/main/java/g3401_3500/s3421_find_students_who_improved/readme.md new file mode 100644 index 000000000..2fc115947 --- /dev/null +++ b/src/main/java/g3401_3500/s3421_find_students_who_improved/readme.md @@ -0,0 +1,65 @@ +3421\. Find Students Who Improved + +Medium + +Table: `Scores` + + +-------------+---------+ + | Column Name | Type | + +-------------+---------+ + | student_id | int | + | subject | varchar | + | score | int | + | exam_date | varchar | + +-------------+---------+ + (student_id, subject, exam_date) is the primary key for this table. + Each row contains information about a student's score in a specific subject on a particular exam date. score is between 0 and 100 (inclusive). + +Write a solution to find the **students who have shown improvement**. A student is considered to have shown improvement if they meet **both** of these conditions: + +* Have taken exams in the **same subject** on at least two different dates +* Their **latest score** in that subject is **higher** than their **first score** + +Return _the result table_ _ordered by_ `student_id,` `subject` _in **ascending** order_. + +The result format is in the following example. + +**Example:** + +**Input:** + +Scores table: + ++------------+----------+-------+------------+ +| student_id | subject | score | exam_date | ++------------+----------+-------+------------+ +| 101 | Math | 70 | 15-01-2023 | +| 101 | Math | 85 | 15-02-2023 | +| 101 | Physics | 65 | 15-01-2023 | +| 101 | Physics | 60 | 15-02-2023 | +| 102 | Math | 80 | 15-01-2023 | +| 102 | Math | 85 | 15-02-2023 | +| 103 | Math | 90 | 15-01-2023 | +| 104 | Physics | 75 | 15-01-2023 | +| 104 | Physics | 85 | 15-02-2023 | ++------------+----------+-------+------------+ + +**Output:** + ++------------+----------+-------------+--------------+ +| student_id | subject | first_score | latest_score | ++------------+----------+-------------+--------------+ +| 101 | Math | 70 | 85 | +| 102 | Math | 80 | 85 | +| 104 | Physics | 75 | 85 | ++------------+----------+-------------+--------------+ + +**Explanation:** + +* Student 101 in Math: Improved from 70 to 85 +* Student 101 in Physics: No improvement (dropped from 65 to 60) +* Student 102 in Math: Improved from 80 to 85 +* Student 103 in Math: Only one exam, not eligible +* Student 104 in Physics: Improved from 75 to 85 + +Result table is ordered by student\_id, subject. \ No newline at end of file diff --git a/src/main/java/g3401_3500/s3421_find_students_who_improved/script.sql b/src/main/java/g3401_3500/s3421_find_students_who_improved/script.sql new file mode 100644 index 000000000..03c15b60b --- /dev/null +++ b/src/main/java/g3401_3500/s3421_find_students_who_improved/script.sql @@ -0,0 +1,16 @@ +# Write your MySQL query statement below +# #Medium #Database #2025_01_17_Time_466_ms_(74.56%)_Space_0B_(100.00%) + +WITH Ranked AS ( + SELECT + student_id, + subject, + FIRST_VALUE(score) OVER(PARTITION BY student_id,subject ORDER BY exam_date) AS first_score, + FIRST_VALUE(score) OVER(PARTITION BY student_id,subject ORDER BY exam_date DESC) AS latest_score + FROM Scores +) + +SELECT * FROM Ranked +WHERE first_score Date: Fri, 17 Jan 2025 02:09:38 +0200 Subject: [PATCH 2/5] Improved readme --- .../readme.md | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/g3401_3500/s3421_find_students_who_improved/readme.md b/src/main/java/g3401_3500/s3421_find_students_who_improved/readme.md index 2fc115947..fce9ce00a 100644 --- a/src/main/java/g3401_3500/s3421_find_students_who_improved/readme.md +++ b/src/main/java/g3401_3500/s3421_find_students_who_improved/readme.md @@ -30,29 +30,29 @@ The result format is in the following example. Scores table: -+------------+----------+-------+------------+ -| student_id | subject | score | exam_date | -+------------+----------+-------+------------+ -| 101 | Math | 70 | 15-01-2023 | -| 101 | Math | 85 | 15-02-2023 | -| 101 | Physics | 65 | 15-01-2023 | -| 101 | Physics | 60 | 15-02-2023 | -| 102 | Math | 80 | 15-01-2023 | -| 102 | Math | 85 | 15-02-2023 | -| 103 | Math | 90 | 15-01-2023 | -| 104 | Physics | 75 | 15-01-2023 | -| 104 | Physics | 85 | 15-02-2023 | -+------------+----------+-------+------------+ + +------------+----------+-------+------------+ + | student_id | subject | score | exam_date | + +------------+----------+-------+------------+ + | 101 | Math | 70 | 15-01-2023 | + | 101 | Math | 85 | 15-02-2023 | + | 101 | Physics | 65 | 15-01-2023 | + | 101 | Physics | 60 | 15-02-2023 | + | 102 | Math | 80 | 15-01-2023 | + | 102 | Math | 85 | 15-02-2023 | + | 103 | Math | 90 | 15-01-2023 | + | 104 | Physics | 75 | 15-01-2023 | + | 104 | Physics | 85 | 15-02-2023 | + +------------+----------+-------+------------+ **Output:** -+------------+----------+-------------+--------------+ -| student_id | subject | first_score | latest_score | -+------------+----------+-------------+--------------+ -| 101 | Math | 70 | 85 | -| 102 | Math | 80 | 85 | -| 104 | Physics | 75 | 85 | -+------------+----------+-------------+--------------+ + +------------+----------+-------------+--------------+ + | student_id | subject | first_score | latest_score | + +------------+----------+-------------+--------------+ + | 101 | Math | 70 | 85 | + | 102 | Math | 80 | 85 | + | 104 | Physics | 75 | 85 | + +------------+----------+-------------+--------------+ **Explanation:** From 54b992357a9083b212b32dc8f7aac095ebd609a9 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Fri, 17 Jan 2025 02:12:10 +0200 Subject: [PATCH 3/5] Fixed format --- .../MysqlTest.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java b/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java index 91093b5b5..1d119bf42 100644 --- a/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java +++ b/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java @@ -20,22 +20,21 @@ @EmbeddedDatabaseTest( compatibilityMode = CompatibilityMode.MySQL, initialSqls = - """ - CREATE TABLE Scores ( - student_id INT, - subject VARCHAR(50), - score INT, - exam_date VARCHAR(10) -); -insert into Scores (student_id, subject, score, exam_date) values ('101', 'Math', '70', '15-01-2023'); -insert into Scores (student_id, subject, score, exam_date) values ('101', 'Math', '85', '15-02-2023'); -insert into Scores (student_id, subject, score, exam_date) values ('101', 'Physics', '65', '15-01-2023'); -insert into Scores (student_id, subject, score, exam_date) values ('101', 'Physics', '60', '15-02-2023'); -insert into Scores (student_id, subject, score, exam_date) values ('102', 'Math', '80', '15-01-2023'); -insert into Scores (student_id, subject, score, exam_date) values ('102', 'Math', '85', '15-02-2023'); -insert into Scores (student_id, subject, score, exam_date) values ('103', 'Math', '90', '15-01-2023'); -insert into Scores (student_id, subject, score, exam_date) values ('104', 'Physics', '75', '15-01-2023'); -insert into Scores (student_id, subject, score, exam_date) values ('104', 'Physics', '85', '15-02-2023');""") + " CREATE TABLE Scores (\n" + + " student_id INT,\n" + + " subject VARCHAR(50),\n" + + " score INT,\n" + + " exam_date VARCHAR(10)\n" + + ");\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('101', 'Math', '70', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('101', 'Math', '85', '15-02-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('101', 'Physics', '65', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('101', 'Physics', '60', '15-02-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('102', 'Math', '80', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('102', 'Math', '85', '15-02-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('103', 'Math', '90', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('104', 'Physics', '75', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values ('104', 'Physics', '85', '15-02-2023');") class MysqlTest { @Test void testScript(@EmbeddedDatabase DataSource dataSource) From 9449c060dee0ef8eb7c66cc12e91a40974fcf80c Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Fri, 17 Jan 2025 02:14:39 +0200 Subject: [PATCH 4/5] Fixed format --- .../MysqlTest.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java b/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java index 1d119bf42..e60c350f2 100644 --- a/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java +++ b/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java @@ -26,15 +26,24 @@ + " score INT,\n" + " exam_date VARCHAR(10)\n" + ");\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('101', 'Math', '70', '15-01-2023');\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('101', 'Math', '85', '15-02-2023');\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('101', 'Physics', '65', '15-01-2023');\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('101', 'Physics', '60', '15-02-2023');\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('102', 'Math', '80', '15-01-2023');\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('102', 'Math', '85', '15-02-2023');\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('103', 'Math', '90', '15-01-2023');\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('104', 'Physics', '75', '15-01-2023');\n" - + "insert into Scores (student_id, subject, score, exam_date) values ('104', 'Physics', '85', '15-02-2023');") + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('101', 'Math', '70', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('101', 'Math', '85', '15-02-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('101', 'Physics', '65', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('101', 'Physics', '60', '15-02-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('102', 'Math', '80', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('102', 'Math', '85', '15-02-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('103', 'Math', '90', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('104', 'Physics', '75', '15-01-2023');\n" + + "insert into Scores (student_id, subject, score, exam_date) values " + + "('104', 'Physics', '85', '15-02-2023');") class MysqlTest { @Test void testScript(@EmbeddedDatabase DataSource dataSource) From 557466eadbd34e1066acfe7648df946b472a36dc Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Fri, 17 Jan 2025 02:16:35 +0200 Subject: [PATCH 5/5] Fixed format --- .../MysqlTest.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java b/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java index e60c350f2..8f546d420 100644 --- a/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java +++ b/src/test/java/g3401_3500/s3421_find_students_who_improved/MysqlTest.java @@ -20,28 +20,28 @@ @EmbeddedDatabaseTest( compatibilityMode = CompatibilityMode.MySQL, initialSqls = - " CREATE TABLE Scores (\n" - + " student_id INT,\n" - + " subject VARCHAR(50),\n" - + " score INT,\n" - + " exam_date VARCHAR(10)\n" - + ");\n" + " CREATE TABLE Scores (" + + " student_id INT," + + " subject VARCHAR(50)," + + " score INT," + + " exam_date VARCHAR(10)" + + ");" + "insert into Scores (student_id, subject, score, exam_date) values " - + "('101', 'Math', '70', '15-01-2023');\n" + + "('101', 'Math', '70', '15-01-2023');" + "insert into Scores (student_id, subject, score, exam_date) values " - + "('101', 'Math', '85', '15-02-2023');\n" + + "('101', 'Math', '85', '15-02-2023');" + "insert into Scores (student_id, subject, score, exam_date) values " - + "('101', 'Physics', '65', '15-01-2023');\n" + + "('101', 'Physics', '65', '15-01-2023');" + "insert into Scores (student_id, subject, score, exam_date) values " - + "('101', 'Physics', '60', '15-02-2023');\n" + + "('101', 'Physics', '60', '15-02-2023');" + "insert into Scores (student_id, subject, score, exam_date) values " - + "('102', 'Math', '80', '15-01-2023');\n" + + "('102', 'Math', '80', '15-01-2023');" + "insert into Scores (student_id, subject, score, exam_date) values " - + "('102', 'Math', '85', '15-02-2023');\n" + + "('102', 'Math', '85', '15-02-2023');" + "insert into Scores (student_id, subject, score, exam_date) values " - + "('103', 'Math', '90', '15-01-2023');\n" + + "('103', 'Math', '90', '15-01-2023');" + "insert into Scores (student_id, subject, score, exam_date) values " - + "('104', 'Physics', '75', '15-01-2023');\n" + + "('104', 'Physics', '75', '15-01-2023');" + "insert into Scores (student_id, subject, score, exam_date) values " + "('104', 'Physics', '85', '15-02-2023');") class MysqlTest {