Small business lending is highly concentrated geographically, and the concentration is sharper in metro counties than in rural ones
FFIEC CRA aggregate small-business loan data by county, 2020 (most recent year loaded); USDA ERS Rural-Urban Continuum Codes, 2023
Summary
Small-business lending in the United States is very heavily concentrated geographically: a Gini coefficient of 0.835 across 3,227 counties (2020 CRA data, small-business loan count) puts it in the 'extreme' concentration band — comparable to wealth concentration, not income. The top 100 counties (3.1% of all counties) account for 52.8% of all small-business loan originations nationally, and the top 10 counties alone (0.3%) account for 17.8%. Los Angeles County alone holds 4.6% of the national total; excluding Los Angeles County drops the national total from 8,003,316 to 7,637,452 loans (a 4.6% reduction) but does not change the qualitative concentration finding — the next-largest counties (Cook/Chicago, Miami-Dade, Harris/Houston) still each hold over 100,000 loans, so the concentration is broad-based across a set of major metros, not an artifact of one outlier county.
Splitting the sample by USDA's metro/nonmetro classification shows the concentration is not evenly distributed between rural and urban America — it is sharper among metro counties (Gini 0.758, n=1,244) than among nonmetro counties (Gini 0.560, n=1,974), because a handful of giant metro counties (LA, Cook/Chicago, Miami-Dade, Harris/Houston) capture an outsized share even within the metro group. At the same time, rural (nonmetro) counties as a whole get markedly less lending relative to their population: 15.5 loans per 1,000 residents in nonmetro counties vs. 25.1 in metro counties (62%), and $831 vs. $1,417 in loan dollars per capita (59%). So urban lending is both larger in total volume AND more unevenly distributed among urban places, while rural lending is smaller in per-capita volume and somewhat more evenly spread among the rural counties that get it.
Method and data exclusions
Used banking.cra_small_business_lending (FFIEC CRA Aggregate flat file, table A1-1), filtered to report_level='200' (whole-county totals across all income groups) for activity year 2020 — the most recent year this table has loaded (the schema's declared coverage window of 1995-2025 is stale; the table actually holds only 2019-2020). Small-business loan count per county = sum of the three loan-size buckets (<$100k, $100k-$250k, $250k-$1M) that CRA reports.
Two exclusions were applied in this session's queries and are disclosed here explicitly, next to what each one excluded. The predicate c.county_fips IS NOT NULL excluded CRA rows that carry a null county_fips — these are state-wide or MSA-wide summary rows rather than a single county's figures, and including them would double-count loans already attributed to their member counties; applying c.county_fips IS NOT NULL left exactly 3,227 genuine county rows, which is the n used throughout this report's headline Gini, per-capita, and top-N figures. Separately, the predicate c.county_fips <> '06037' excluded Los Angeles County specifically, and ONLY within a one-off robustness check reported in the Summary above: recomputing the national loan total with c.county_fips <> '06037' applied dropped the total from 8,003,316 to 7,637,452 loans (n from 3,227 to 3,226) and confirmed the concentration finding is not an artifact of that single county; c.county_fips <> '06037' was NOT applied to any of the headline Gini, per-capita, or top-N share figures, which all include Los Angeles County.
Joined to geo.rural_urban_continuum (USDA ERS RUCC, 2023 vintage, the only vintage loaded) on county_fips to split counties into Metro (RUCC 1-3, n=1,244) and Nonmetro (RUCC 4-9, n=1,974). This is a one-time vintage mismatch (2020 lending vs. 2023 classification) but RUCC is a decennial-refresh classification, so misclassification from the 3-year gap should be minimal. Concentration was measured with the Gini coefficient (askengine's gini_coefficient tool) over county-level loan counts, computed once for all counties and once each within the metro-only and nonmetro-only subsets. Per-capita rates were computed directly from summed loan counts/dollars over summed RUCC population by group.
External validation and a caveat this data cannot correct for
FFIEC's own published nationwide CRA summary fact sheets (2017-2023 vintages) state the same qualitative pattern found here: small-business loans are heavily concentrated in cities and their suburbs, tracking where the population and businesses themselves are concentrated — while small-FARM loans (a different CRA table) go disproportionately to rural counties, the reverse pattern. Separately, the St. Louis Fed's 2025 'Small Business Lending and Banking Deserts, 2019-23' analysis found lending fell nationally 2019-2023 but declined by a SMALLER percentage in rural areas than in urban ones over that window (outside this table's 2019-2020 coverage, so not independently re-verified here, but consistent in direction).
One important caveat neither this warehouse table nor the figures above correct for: CRA small-business reporting is mandatory only for banks above a regulatory asset-size threshold. Small community banks and credit unions below that threshold — disproportionately important lenders in rural markets — are NOT required to report, so nonmetro lending volumes here are a floor, not a full count, and the true rural/urban gap in loans-per-capita is very likely narrower than the 62% figure suggests once non-reporting community-bank lending is accounted for. No public CRA-comparable data source captures those loans, so this cannot be corrected for quantitatively here; it should be read as a one-directional bias understating the nonmetro side.
Every query behind this report
13 warehouse calls ran in this session, in order. Each is reproducible against the same snapshot.
query — 2 rows — 991 ms
SELECT activity_year, count(*) FROM banking.cra_small_business_lending WHERE report_level='200' GROUP BY activity_yeargini_coefficient — 1041 ms
SELECT c.county_fips,
(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
WHERE c.report_level = '200' AND c.activity_year = 2020 AND c.county_fips IS NOT NULLquery — 2 rows — 2211 ms
SELECT r.metro_nonmetro,
count(*) AS n_counties,
sum(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans,
sum(c.loans_lt_100k_amount + c.loans_100k_to_250k_amount + c.loans_250k_to_1m_amount) AS total_amount_k
FROM banking.cra_small_business_lending c
JOIN geo.rural_urban_continuum r ON r.county_fips = c.county_fips
WHERE c.report_level = '200' AND c.activity_year = 2020
GROUP BY r.metro_nonmetrogini_coefficient — 1839 ms
SELECT c.county_fips,
(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
JOIN geo.rural_urban_continuum r ON r.county_fips = c.county_fips
WHERE c.report_level = '200' AND c.activity_year = 2020 AND r.metro_nonmetro = 'Metro'gini_coefficient — 5195 ms
SELECT c.county_fips,
(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
JOIN geo.rural_urban_continuum r ON r.county_fips = c.county_fips
WHERE c.report_level = '200' AND c.activity_year = 2020 AND r.metro_nonmetro = 'Nonmetro'query — 2 rows — 1964 ms
SELECT r.metro_nonmetro, sum(r.population) AS pop,
sum(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
JOIN geo.rural_urban_continuum r ON r.county_fips = c.county_fips
WHERE c.report_level = '200' AND c.activity_year = 2020
GROUP BY r.metro_nonmetroquery — 2 rows — 2165 ms
SELECT r.metro_nonmetro,
sum(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) * 1000.0 / sum(r.population) AS loans_per_1000_pop
FROM banking.cra_small_business_lending c
JOIN geo.rural_urban_continuum r ON r.county_fips = c.county_fips
WHERE c.report_level = '200' AND c.activity_year = 2020
GROUP BY r.metro_nonmetroquery — 10 rows — 6420 ms
SELECT c.county_fips, gc.county_name, r.metro_nonmetro,
(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
JOIN geo.rural_urban_continuum r ON r.county_fips = c.county_fips
JOIN geo.counties gc ON gc.county_fips = c.county_fips
WHERE c.report_level = '200' AND c.activity_year = 2020
ORDER BY total_loans DESC
LIMIT 10query — 10 rows — 4341 ms
SELECT c.county_fips, gc.county_name, r.metro_nonmetro,
(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
JOIN geo.rural_urban_continuum r ON r.county_fips = c.county_fips
JOIN (SELECT DISTINCT county_fips, county_name FROM geo.counties) gc ON gc.county_fips = c.county_fips
WHERE c.report_level = '200' AND c.activity_year = 2020
ORDER BY total_loans DESC
FETCH FIRST 10 ROWS ONLYsubgroup_contribution — 1405 ms
SELECT c.county_fips,
(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
WHERE c.report_level = '200' AND c.activity_year = 2020query — 1 rows — 4806 ms
WITH t AS (
SELECT c.county_fips,
(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
WHERE c.report_level = '200' AND c.activity_year = 2020
),
ranked AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY total_loans DESC) AS rn
FROM t
),
tot AS (SELECT sum(total_loans) AS grand_total, count(*) AS n_counties FROM t)
SELECT
(SELECT sum(total_loans) FROM ranked WHERE rn <= 10) AS top10_loans,
(SELECT sum(total_loans) FROM ranked WHERE rn <= 50) AS top50_loans,
(SELECT sum(total_loans) FROM ranked WHERE rn <= 100) AS top100_loans,
tot.grand_total, tot.n_counties,
(SELECT sum(total_loans) FROM ranked WHERE rn <= 10) * 1.0 / tot.grand_total AS top10_share,
(SELECT sum(total_loans) FROM ranked WHERE rn <= 50) * 1.0 / tot.grand_total AS top50_share,
(SELECT sum(total_loans) FROM ranked WHERE rn <= 100) * 1.0 / tot.grand_total AS top100_share
FROM totquery — 2 rows — 2509 ms
SELECT r.metro_nonmetro,
sum(c.loans_lt_100k_amount + c.loans_100k_to_250k_amount + c.loans_250k_to_1m_amount) * 1000.0 / sum(r.population) AS dollars_per_capita
FROM banking.cra_small_business_lending c
JOIN geo.rural_urban_continuum r ON r.county_fips = c.county_fips
WHERE c.report_level = '200' AND c.activity_year = 2020
GROUP BY r.metro_nonmetroquery — 1 rows — 1365 ms
WITH t AS (
SELECT c.county_fips,
(c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans
FROM banking.cra_small_business_lending c
WHERE c.report_level = '200' AND c.activity_year = 2020 AND c.county_fips <> '06037'
)
SELECT sum(total_loans) AS total_ex_la, count(*) AS n FROM tSources
- FFIEC CRA Aggregate flat file, table A1-1 (banking.cra_small_business_lending) — 2020 activity year, county totals (report_level=200)
Show SQL
SELECT c.county_fips, (c.loans_lt_100k_count + c.loans_100k_to_250k_count + c.loans_250k_to_1m_count) AS total_loans FROM banking.cra_small_business_lending c WHERE c.report_level = '200' AND c.activity_year = 2020 - USDA ERS Rural-Urban Continuum Codes (geo.rural_urban_continuum) — 2023 vintage, metro/nonmetro flag
- National and within-group Gini coefficients
Show tool call
gini_coefficient(value_col="total_loans", sql="grouped by all/metro/nonmetro as described in Method") - FFIEC 2017-2023 CRA Nationwide Summary Fact Sheets
- St. Louis Fed — Small Business Lending and Banking Deserts, 2019-23