Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ccd5497

Browse files
feat: update solution to lc problem: No.3580 (doocs#4473)
No.3580.Find Consistently Improving Employees
1 parent 76a5f03 commit ccd5497

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)

AltStyle によって変換されたページ (->オリジナル) /