library(tidyverse)
library(readxl)
path <- "Excel/800-899/867/867 Longest Streak.xlsx"
input <- read_excel(path, range = "A1:G101")
test <- read_excel(path, range = "I1:J7")
result <- input %>%
arrange(Rep, Year, Quarter) %>%
complete(
Rep,
Year,
Quarter = paste0("Q", 1:4),
fill = list(Revenue = 0, Target = 0)
) %>%
mutate(goal_achieved = Revenue >= Target) %>%
group_by(Rep) %>%
mutate(c = cumsum(goal_achieved != lag(goal_achieved, default = FALSE))) %>%
summarise(
longest_streak = max(rle(goal_achieved)$lengths[
rle(goal_achieved)$values == TRUE
])
) %>%
ungroup() %>%
arrange(desc(longest_streak))Excel BI - Excel Challenge 867
excel-challenges
excel-formulas
🔰 Find Reps who met or exceeded target sales in at least 5 consecutive quarters and list the longest streaks.

Challenge Description
🔰 Find Reps who met or exceeded target sales in at least 5 consecutive quarters and list the longest streaks. Sort on Descending of Longest Streak and Ascending on Name.
Solutions
- Logic: Read the workbook ranges needed for the challenge; Derive the required intermediate columns; Aggregate or rank the data at the required grouping level.
- Strengths: The transformation is organized around the correct grouping level, which keeps the business logic clear.
- Areas for Improvement: The solution assumes the workbook layout and selected ranges remain stable, so any structural change in the sheet would require small adjustments.
- Gem: The key move is solving the problem at the right grain before shaping the final output.
import pandas as pd
path = "Excel/800-899/867/867 Longest Streak.xlsx"
input = pd.read_excel(path, usecols="A:G", nrows=100, skiprows=0)
test = pd.read_excel(path, usecols="I:J", nrows=6, skiprows=0)
df = input.sort_values("Rep")
df["goal_achieved"] = df["Revenue"] > df["Target"]
df["c"] = df.groupby("Rep")["goal_achieved"].transform(lambda x: (~x).cumsum())
streaks = df.groupby(["Rep", "c"]).size().reset_index(name="streak")
result = streaks.groupby("Rep")["streak"].max().reset_index(name="longest_streak")
result = result.sort_values("longest_streak", ascending=False).reset_index(drop=True)
print(result)The Python version follows the same grouped logic and keeps the transformation explicit in a dataframe pipeline.
Difficulty Level
Medium
The individual steps are manageable, but the correct transformation pattern is not obvious from the raw data.