Skip to content

Commit c04979f

Browse files
committed
feat: update solution to lc problem: No.3580
No.3580.Find Consistently Improving Employees
1 parent 76a5f03 commit c04979f

File tree

4 files changed

+108
-138
lines changed

4 files changed

+108
-138
lines changed

solution/3500-3599/3580.Find Consistently Improving Employees/README.md

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -174,33 +174,27 @@ WITH
174174
recent AS (
175175
SELECT
176176
employee_id,
177-
rating,
178177
review_date,
179178
ROW_NUMBER() OVER (
180179
PARTITION BY employee_id
181180
ORDER BY review_date DESC
182181
) AS rn,
183-
LAG(rating) OVER (
184-
PARTITION BY employee_id
185-
ORDER BY review_date DESC
186-
) AS prev_rating
182+
(
183+
LAG(rating) OVER (
184+
PARTITION BY employee_id
185+
ORDER BY review_date DESC
186+
) - rating
187+
) AS delta
187188
FROM performance_reviews
188-
),
189-
deltas AS (
190-
SELECT
191-
employee_id,
192-
prev_rating - rating AS delta,
193-
rn
194-
FROM recent
195-
WHERE rn > 1 AND rn <= 3
196189
)
197190
SELECT
198191
employee_id,
199192
name,
200193
SUM(delta) AS improvement_score
201194
FROM
202-
deltas
195+
recent
203196
JOIN employees USING (employee_id)
197+
WHERE rn > 1 AND rn <= 3
204198
GROUP BY 1
205199
HAVING COUNT(*) = 2 AND MIN(delta) > 0
206200
ORDER BY 3 DESC, 2;
@@ -215,42 +209,38 @@ import pandas as pd
215209
def find_consistently_improving_employees(
216210
employees: pd.DataFrame, performance_reviews: pd.DataFrame
217211
) -> pd.DataFrame:
218-
recent = (
219-
performance_reviews.sort_values(
220-
["employee_id", "review_date"], ascending=[True, False]
221-
)
222-
.groupby("employee_id")
223-
.head(3)
212+
performance_reviews = performance_reviews.sort_values(
213+
["employee_id", "review_date"], ascending=[True, False]
224214
)
225-
226-
three_reviews_ids = recent["employee_id"].value_counts().loc[lambda s: s == 3].index
227-
recent = recent[recent["employee_id"].isin(three_reviews_ids)]
228-
recent = recent.sort_values(["employee_id", "review_date"])
229-
230-
def strictly_increasing(ratings: pd.Series) -> bool:
231-
return (ratings.diff().dropna() > 0).all()
232-
233-
improving_ids = (
234-
recent.groupby("employee_id")["rating"]
235-
.apply(strictly_increasing)
236-
.loc[lambda s: s]
237-
.index
215+
performance_reviews["rn"] = (
216+
performance_reviews.groupby("employee_id").cumcount() + 1
238217
)
239-
improving = recent[recent["employee_id"].isin(improving_ids)]
240-
241-
scores = (
242-
improving.groupby("employee_id")["rating"]
243-
.agg(lambda x: x.iloc[-1] - x.iloc[0])
244-
.reset_index(name="improvement_score")
218+
performance_reviews["lag_rating"] = performance_reviews.groupby("employee_id")[
219+
"rating"
220+
].shift(1)
221+
performance_reviews["delta"] = (
222+
performance_reviews["lag_rating"] - performance_reviews["rating"]
245223
)
246-
247-
result = (
248-
scores.merge(employees, on="employee_id")
249-
.loc[:, ["employee_id", "name", "improvement_score"]]
250-
.sort_values(["improvement_score", "name"], ascending=[False, True])
251-
.reset_index(drop=True)
224+
recent = performance_reviews[
225+
(performance_reviews["rn"] > 1) & (performance_reviews["rn"] <= 3)
226+
]
227+
improvement = (
228+
recent.groupby("employee_id")
229+
.agg(
230+
improvement_score=("delta", "sum"),
231+
count=("delta", "count"),
232+
min_delta=("delta", "min"),
233+
)
234+
.reset_index()
235+
)
236+
improvement = improvement[
237+
(improvement["count"] == 2) & (improvement["min_delta"] > 0)
238+
]
239+
result = improvement.merge(employees[["employee_id", "name"]], on="employee_id")
240+
result = result.sort_values(
241+
by=["improvement_score", "name"], ascending=[False, True]
252242
)
253-
return result
243+
return result[["employee_id", "name", "improvement_score"]]
254244
```
255245

256246
<!-- tabs:end -->

solution/3500-3599/3580.Find Consistently Improving Employees/README_EN.md

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -174,33 +174,27 @@ WITH
174174
recent AS (
175175
SELECT
176176
employee_id,
177-
rating,
178177
review_date,
179178
ROW_NUMBER() OVER (
180179
PARTITION BY employee_id
181180
ORDER BY review_date DESC
182181
) AS rn,
183-
LAG(rating) OVER (
184-
PARTITION BY employee_id
185-
ORDER BY review_date DESC
186-
) AS prev_rating
182+
(
183+
LAG(rating) OVER (
184+
PARTITION BY employee_id
185+
ORDER BY review_date DESC
186+
) - rating
187+
) AS delta
187188
FROM performance_reviews
188-
),
189-
deltas AS (
190-
SELECT
191-
employee_id,
192-
prev_rating - rating AS delta,
193-
rn
194-
FROM recent
195-
WHERE rn > 1 AND rn <= 3
196189
)
197190
SELECT
198191
employee_id,
199192
name,
200193
SUM(delta) AS improvement_score
201194
FROM
202-
deltas
195+
recent
203196
JOIN employees USING (employee_id)
197+
WHERE rn > 1 AND rn <= 3
204198
GROUP BY 1
205199
HAVING COUNT(*) = 2 AND MIN(delta) > 0
206200
ORDER BY 3 DESC, 2;
@@ -215,42 +209,38 @@ import pandas as pd
215209
def find_consistently_improving_employees(
216210
employees: pd.DataFrame, performance_reviews: pd.DataFrame
217211
) -> pd.DataFrame:
218-
recent = (
219-
performance_reviews.sort_values(
220-
["employee_id", "review_date"], ascending=[True, False]
221-
)
222-
.groupby("employee_id")
223-
.head(3)
212+
performance_reviews = performance_reviews.sort_values(
213+
["employee_id", "review_date"], ascending=[True, False]
224214
)
225-
226-
three_reviews_ids = recent["employee_id"].value_counts().loc[lambda s: s == 3].index
227-
recent = recent[recent["employee_id"].isin(three_reviews_ids)]
228-
recent = recent.sort_values(["employee_id", "review_date"])
229-
230-
def strictly_increasing(ratings: pd.Series) -> bool:
231-
return (ratings.diff().dropna() > 0).all()
232-
233-
improving_ids = (
234-
recent.groupby("employee_id")["rating"]
235-
.apply(strictly_increasing)
236-
.loc[lambda s: s]
237-
.index
215+
performance_reviews["rn"] = (
216+
performance_reviews.groupby("employee_id").cumcount() + 1
238217
)
239-
improving = recent[recent["employee_id"].isin(improving_ids)]
240-
241-
scores = (
242-
improving.groupby("employee_id")["rating"]
243-
.agg(lambda x: x.iloc[-1] - x.iloc[0])
244-
.reset_index(name="improvement_score")
218+
performance_reviews["lag_rating"] = performance_reviews.groupby("employee_id")[
219+
"rating"
220+
].shift(1)
221+
performance_reviews["delta"] = (
222+
performance_reviews["lag_rating"] - performance_reviews["rating"]
245223
)
246-
247-
result = (
248-
scores.merge(employees, on="employee_id")
249-
.loc[:, ["employee_id", "name", "improvement_score"]]
250-
.sort_values(["improvement_score", "name"], ascending=[False, True])
251-
.reset_index(drop=True)
224+
recent = performance_reviews[
225+
(performance_reviews["rn"] > 1) & (performance_reviews["rn"] <= 3)
226+
]
227+
improvement = (
228+
recent.groupby("employee_id")
229+
.agg(
230+
improvement_score=("delta", "sum"),
231+
count=("delta", "count"),
232+
min_delta=("delta", "min"),
233+
)
234+
.reset_index()
235+
)
236+
improvement = improvement[
237+
(improvement["count"] == 2) & (improvement["min_delta"] > 0)
238+
]
239+
result = improvement.merge(employees[["employee_id", "name"]], on="employee_id")
240+
result = result.sort_values(
241+
by=["improvement_score", "name"], ascending=[False, True]
252242
)
253-
return result
243+
return result[["employee_id", "name", "improvement_score"]]
254244
```
255245

256246
<!-- tabs:end -->

solution/3500-3599/3580.Find Consistently Improving Employees/Solution.py

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,35 @@
44
def find_consistently_improving_employees(
55
employees: pd.DataFrame, performance_reviews: pd.DataFrame
66
) -> pd.DataFrame:
7-
recent = (
8-
performance_reviews.sort_values(
9-
["employee_id", "review_date"], ascending=[True, False]
10-
)
11-
.groupby("employee_id")
12-
.head(3)
7+
performance_reviews = performance_reviews.sort_values(
8+
["employee_id", "review_date"], ascending=[True, False]
139
)
14-
15-
three_reviews_ids = recent["employee_id"].value_counts().loc[lambda s: s == 3].index
16-
recent = recent[recent["employee_id"].isin(three_reviews_ids)]
17-
recent = recent.sort_values(["employee_id", "review_date"])
18-
19-
def strictly_increasing(ratings: pd.Series) -> bool:
20-
return (ratings.diff().dropna() > 0).all()
21-
22-
improving_ids = (
23-
recent.groupby("employee_id")["rating"]
24-
.apply(strictly_increasing)
25-
.loc[lambda s: s]
26-
.index
10+
performance_reviews["rn"] = (
11+
performance_reviews.groupby("employee_id").cumcount() + 1
2712
)
28-
improving = recent[recent["employee_id"].isin(improving_ids)]
29-
30-
scores = (
31-
improving.groupby("employee_id")["rating"]
32-
.agg(lambda x: x.iloc[-1] - x.iloc[0])
33-
.reset_index(name="improvement_score")
13+
performance_reviews["lag_rating"] = performance_reviews.groupby("employee_id")[
14+
"rating"
15+
].shift(1)
16+
performance_reviews["delta"] = (
17+
performance_reviews["lag_rating"] - performance_reviews["rating"]
3418
)
35-
36-
result = (
37-
scores.merge(employees, on="employee_id")
38-
.loc[:, ["employee_id", "name", "improvement_score"]]
39-
.sort_values(["improvement_score", "name"], ascending=[False, True])
40-
.reset_index(drop=True)
19+
recent = performance_reviews[
20+
(performance_reviews["rn"] > 1) & (performance_reviews["rn"] <= 3)
21+
]
22+
improvement = (
23+
recent.groupby("employee_id")
24+
.agg(
25+
improvement_score=("delta", "sum"),
26+
count=("delta", "count"),
27+
min_delta=("delta", "min"),
28+
)
29+
.reset_index()
30+
)
31+
improvement = improvement[
32+
(improvement["count"] == 2) & (improvement["min_delta"] > 0)
33+
]
34+
result = improvement.merge(employees[["employee_id", "name"]], on="employee_id")
35+
result = result.sort_values(
36+
by=["improvement_score", "name"], ascending=[False, True]
4137
)
42-
return result
38+
return result[["employee_id", "name", "improvement_score"]]

solution/3500-3599/3580.Find Consistently Improving Employees/Solution.sql

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,27 @@ WITH
22
recent AS (
33
SELECT
44
employee_id,
5-
rating,
65
review_date,
76
ROW_NUMBER() OVER (
87
PARTITION BY employee_id
98
ORDER BY review_date DESC
109
) AS rn,
11-
LAG(rating) OVER (
12-
PARTITION BY employee_id
13-
ORDER BY review_date DESC
14-
) AS prev_rating
10+
(
11+
LAG(rating) OVER (
12+
PARTITION BY employee_id
13+
ORDER BY review_date DESC
14+
) - rating
15+
) AS delta
1516
FROM performance_reviews
16-
),
17-
deltas AS (
18-
SELECT
19-
employee_id,
20-
prev_rating - rating AS delta,
21-
rn
22-
FROM recent
23-
WHERE rn > 1 AND rn <= 3
2417
)
2518
SELECT
2619
employee_id,
2720
name,
2821
SUM(delta) AS improvement_score
2922
FROM
30-
deltas
23+
recent
3124
JOIN employees USING (employee_id)
25+
WHERE rn > 1 AND rn <= 3
3226
GROUP BY 1
3327
HAVING COUNT(*) = 2 AND MIN(delta) > 0
3428
ORDER BY 3 DESC, 2;

0 commit comments

Comments
 (0)