Skip to content
Ben Manguiat
All work

Reaching level 9 in ranked TFT meant a top‑4 finish 87% of the time.

Loaded ~400K ranked Teamfight Tactics player boards (49,977 matches, Platinum to Challenger) into Snowflake, unpacked nested trait data with SQL, and built a Power BI dashboard on what separates top‑4 finishes.

Project
TFT Ranked Match Analysis in Snowflake
Role
Data Analyst (Solo Project)
When
Fall 2025
Matches
49,977
Player Boards
399,906

Source code

What I found

  • Reaching level 9 was the strongest signal found: 86.6% top‑4 rate vs 51.3% at level 8.
  • Starship (69.0% top‑4) and Mercenary (60.6%) boards placed best; Vanguard (48.1%) and Sorcerer (49.2%) placed worst among common traits.
  • Flagged that trait results are confounded with level: high-cost traits mostly appear on boards that were already ahead.

The data

Set 3 ranked matches, Korean server, Platinum to Challenger.

Top-4 rate by player level at the end of the gameShare of boards that finished in the top four of eight

Source: 399,906 player boards from 49,977 Set 3 ranked matches (Korean server, Platinum to Challenger), cleaned and queried in Snowflake. Players who are already ahead level faster, so this is an association, not a cause.

Top-4 rate by trait on the board
NameTop-4 rate
Starship23.2K boards, avg 3.53
69.0%
Mercenary127.3K boards, avg 3.94
60.6%
Valkyrie178.6K boards, avg 4.24
54.9%
Mystic140.9K boards, avg 4.30
53.4%
Sorcerer136.0K boards, avg 4.54
49.2%
Vanguard191.0K boards, avg 4.59
48.1%
Half of all boards finish top four. Traits with 5,000+ boards.

These are correlations, not trait strength. Starship is a single 5-cost unit, so it mostly shows up on boards that already reached a high level, and level separates outcomes more than any single trait.

The question

Ranked TFT match exports store each board's traits and champions as nested text, one CSV per rank tier. That makes it hard to answer basic questions like which traits and levels actually lead to top‑4 finishes.

How I built it

  1. Staged 5 rank-tier CSVs (Set 3, Korean server) in Snowflake with a custom CSV file format.
  2. Loaded each tier with COPY INTO, tagging rows by rank and parsing nested trait/champion text into VARIANT columns.
  3. Removed duplicate rows and rows with invalid placements before analysis.
  4. Used LATERAL FLATTEN to unpack traits and aggregate placement and top‑4 rate per trait and per player level.
  5. Connected Power BI directly to Snowflake for KPI, rank-tier and trait-effectiveness views.

The code

SQL (Snowflake)

-- Top-4 rate and average placement per trait
SELECT
  REPLACE(t.key, 'Set3_', '')                         AS trait,
  COUNT(*)                                            AS boards,
  ROUND(AVG(m.placement), 2)                          AS avg_placement,
  ROUND(AVG(IFF(m.placement <= 4, 1, 0)) * 100, 1)    AS top_4_rate_pct
FROM matches m,
     LATERAL FLATTEN(input => m.traits) t
WHERE m.placement BETWEEN 1 AND 8
GROUP BY 1
HAVING COUNT(*) >= 5000
ORDER BY avg_placement;

What I delivered

A reproducible Snowflake load (scripts run in order) feeding a Power BI dashboard on placement, rank tier and trait effectiveness.