Get the data

Heads up on Original: the Commission does not publish this table on its own. It publishes Production Data Query Dump, which this was parsed out of — so Original gets you that whole file, not just this table. Every other format is this table alone.

Free. You will be asked to confirm an email address before the files are built — that is the only gate, and it is there so we can tell you when a large export is ready.

Preview the first 100 rows

What this is

One of the sixteen delimited tables inside the monthly Production Data Query dump. RRC publishes the dump as a single archive; EZRRC publishes each table inside it separately so you can take the one you need instead of a 3.6 GB zip.

This is the big one: 76 million rows, one per lease per month, carrying production volume, allowable and ending balance for oil, gas, condensate and casinghead gas, plus the operator, field and lease names denormalised onto the row.

If you want to know what Texas produced, this is the table.

What you can do with it

Build a monthly production history for any lease, operator, field or district back to 1993.

Rank operators by production, measure decline curves at lease level, and compare produced volume against the allowable the Commission set.

Join to the regulatory lease directory for the well count and the field number, and to the P-5 directory for the operator's status.

Gotchas

76 million rows and about 31 GB. Filter before you export — a county, an operator, a field or a date range all cut it to something workable.

A lease number is only unique with the oil/gas code and the district in it. Oil lease 027587 in District 08 and gas lease 027587 in District 08 are different leases; so is oil lease 027587 in District 09.

district_no here is RRC's INTERNAL district numbering (01-14, 20), not the designation the industry prints. Internal 07 is District 6E, 08 is 7B, 09 is 7C, 10 is District 08, 11 is 8A, 13 is 09 and 14 is District 10. The district directory is the lookup; reading the number as a label is wrong.

Volumes are whole numbers in the reporting unit — barrels for liquids, MCF for gas. There are no implied decimals here, unlike the EBCDIC ledgers.

Cycle year and cycle month are separate columns; cycle_year_month is the two of them concatenated as YYYYMM and is the cheapest thing to range on.

Production is reported by lease, not by well. A lease can be one well or two hundred.

Record layout

33 columns.

pdq_og_lease_cycle 33 columns

Record layout for pdq_og_lease_cycle — 33 columns
# Column Type RRC name Meaning Lookup
1 oil_gas_code key join text Whether the lease is carried on the oil schedule or the gas schedule. e.g. O Oil or gas schedule
2 district_no key join text RRC's INTERNAL district number, 01 to 14 plus 20 for statewide. This is not the district name the industry uses: internal 07 is District 6E, 08 is 7B, 09 is 7C, 10 is District 08, 11 is 8A, 13 is 09 and 14 is District 10. Join to the district directory rather than reading it as a label. e.g. 08 RRC district (internal number)
3 lease_no key join text RRC lease number. Unique only within a district and a schedule, so a lease key is district + oil/gas code + lease number.
4 cycle_year text Production cycle year, four digits.
5 cycle_month text Production cycle month, two digits.
6 cycle_year_month key text Production cycle as YYYYMM. This is the column to filter a date range on. e.g. 202606
7 lease_no_district_no bigint Lease number district number
8 operator_no join text The operator's six-digit RRC P-5 organization number. Join to the P-5 Organization dataset for the company's name, address and P-5 status.
9 field_no join text The eight-digit RRC field number. The field's name is not in most files; join to the field directory to get it.
10 field_type text Field type
11 gas_well_no text Gas well number
12 prod_report_filed_flag text Prod report filed flag
13 lease_oil_prod_vol bigint measured in bbl Lease oil prod vol
14 lease_oil_allow bigint measured in bbl Lease oil allow
15 lease_oil_ending_bal bigint measured in bbl Lease oil ending bal
16 lease_gas_prod_vol bigint measured in MCF Lease gas prod vol
17 lease_gas_allow bigint measured in MCF Lease gas allow
18 lease_gas_lift_inj_vol bigint measured in MCF Lease gas lift inj vol
19 lease_cond_prod_vol bigint measured in bbl Lease cond prod vol
20 lease_cond_limit bigint measured in bbl Lease cond limit
21 lease_cond_ending_bal bigint measured in bbl Lease cond ending bal
22 lease_csgd_prod_vol bigint measured in MCF Lease csgd prod vol
23 lease_csgd_limit bigint measured in MCF Lease csgd limit
24 lease_csgd_gas_lift bigint measured in MCF Lease csgd gas lift
25 lease_oil_tot_disp bigint measured in bbl Lease oil tot disp
26 lease_gas_tot_disp bigint measured in MCF Lease gas tot disp
27 lease_cond_tot_disp bigint measured in bbl Lease cond tot disp
28 lease_csgd_tot_disp bigint measured in MCF Lease csgd tot disp
29 district_name text RRC district as the industry writes it, e.g. 7B, 8A, 6E.
30 lease_name text Lease name as filed.
31 operator_name text Operator name as carried in this file. Names drift between filings — join on the operator number, never on the name.
32 field_name text Field name.
33 ingested_at timestamptz When the upstream pipeline last wrote this row. Not an RRC field — it is EZRRC's provenance stamp, and it is what the freshness badge is measured against.

Code lookups used here

Every coded column in this dataset resolves to a real lookup table, so a well code of G can be read as what it actually means.

RRC district (internal number) 14 values

Read by district_no

RRC's internal sequential district numbering, 01 to 14 plus 20 for statewide. The production data, the UIC database and the high-cost gas certifications all use this. Internal 07 is District 6E, 08 is 7B, 09 is 7C, 10 is District 08, 11 is 8A, 13 is 09 and 14 is District 10. There is no internal 12.

RRC district (internal number) — 14 codes and their meanings
CodeMeans
01 District 01 — San Antonio (internal 01) Internal district number 01, which RRC prints as District 01 and administers from San Antonio.
02 District 02 — San Antonio (internal 02) Internal district number 02, which RRC prints as District 02 and administers from San Antonio.
03 District 03 — Houston (internal 03) Internal district number 03, which RRC prints as District 03 and administers from Houston.
04 District 04 — Corpus Christi (internal 04) Internal district number 04, which RRC prints as District 04 and administers from Corpus Christi.
05 District 05 — Kilgore (internal 05) Internal district number 05, which RRC prints as District 05 and administers from Kilgore.
06 District 06 — Kilgore (internal 06) Internal district number 06, which RRC prints as District 06 and administers from Kilgore.
07 District 6E — Kilgore (internal 07) Internal district number 07, which RRC prints as District 6E and administers from Kilgore.
08 District 7B — Abilene (internal 08) Internal district number 08, which RRC prints as District 7B and administers from Abilene.
09 District 7C — San Angelo (internal 09) Internal district number 09, which RRC prints as District 7C and administers from San Angelo.
10 District 08 — Midland (internal 10) Internal district number 10, which RRC prints as District 08 and administers from Midland.
11 District 8A — Midland (internal 11) Internal district number 11, which RRC prints as District 8A and administers from Midland.
13 District 09 — Wichita Falls (internal 13) Internal district number 13, which RRC prints as District 09 and administers from Wichita Falls.
14 District 10 — Pampa (internal 14) Internal district number 14, which RRC prints as District 10 and administers from Pampa.
20 District 20 — State Wide (internal 20) Internal district number 20, which RRC prints as District 20 and administers from State Wide.

Source: Generated from texas.pdq_gp_district.district_no

Oil or gas schedule 2 values

Read by oil_gas_code

Which schedule a lease is carried on. This is not decoration: an oil lease number and a gas lease number can be the same digits and mean different leases, so a lease key is only unique with this code and the district in it.

Oil or gas schedule — 2 codes and their meanings
CodeMeans
O Oil Carried on the oil proration schedule; lease numbers are oil lease numbers.
G Gas Carried on the gas proration schedule; lease numbers are gas well IDs.

Source: PDQ Dump user manual; values confirmed as the complete distinct set in texas.pdq_og_lease_cycle.oil_gas_code

What this joins to

The Railroad Commission never states these keys anywhere in the files. They are the reason the data is hard to use, so here they are with the exact columns on both sides.

PDQ Lease Production by Cycle joins to PDQ Regulatory Lease Directory on Oil gas code and District number and Lease number — many rows here share a single row there.

produced from the lease

Production rows carry a lease key and nothing else identifying. The regulatory lease directory is what turns that key into a lease name, an operator, a field number and a well number, and it is where the severance flag lives. Exact on all 5,000 sampled rows. The key is three columns, not one: the oil/gas code, the district and the lease number. Any two of them alone are ambiguous.

pdq-lease-cycle.oil_gas_code = pdq-regulatory-lease-directory.oil_gas_code AND pdq-lease-cycle.district_no = pdq-regulatory-lease-directory.district_no AND pdq-lease-cycle.lease_no = pdq-regulatory-lease-directory.lease_no

PDQ Lease Production by Cycle joins to PDQ Lease Disposition by Cycle on Oil gas code and District number and Lease number and Cycle year month — one row here matches one row there.

was disposed of as

Production says how much came out of the ground; disposition says where it went — sold, flared, injected, used as lease fuel. Same lease and same cycle, one row each.

pdq-lease-cycle.oil_gas_code = pdq-lease-disposition-cycle.oil_gas_code AND pdq-lease-cycle.district_no = pdq-lease-disposition-cycle.district_no AND pdq-lease-cycle.lease_no = pdq-lease-disposition-cycle.lease_no AND pdq-lease-cycle.cycle_year_month = pdq-lease-disposition-cycle.cycle_year_month

PDQ Lease Production by Cycle joins to PDQ Operator Directory on Operator number — many rows here share a single row there.

reported by

The operator that filed the production report for that month, resolved through the production system's own operator directory.

pdq-lease-cycle.operator_no = pdq-operator-directory.operator_no

PDQ Lease Production by Cycle joins to PDQ Field Directory on Field number — many rows here share a single row there.

produced from the field

The eight-digit field number resolved to a field name, class, discovery date and rules flags.

pdq-lease-cycle.field_no = pdq-field-directory.field_no

PDQ Lease Production by Cycle joins to P-5 Organization (ASCII) on Operator number = ID — many rows here share a single row there.

reported by the organization

The same operator number against the authoritative P-5 register, which carries the organisation type, address and status that the production system's copy does not. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

pdq-lease-cycle.operator_no = p5-organization-ascii.id

PDQ Lease Production by Cycle joins to Historical Ledger — Statewide Oil on District number = District and Lease number = Lease number — many rows here share a single row there.

produced, by month

The two long series side by side, and the reason to know which one you want. Both reach back to January 1993 and ALL 158,566 leases on this tape have PDQ cycles -- a clean 100%, the best rate in this family. Where both carry a figure they agree: in cycle 200506 the P-1 oil volume here is identical to lease_oil_prod_vol on all 69,283 leases reporting, and in 201506 on 83,454 of 83,479. Take PDQ when you want the lease NAME, the operator name and the field name, which this tape does not carry at all. Take this one for the allowable, the movable balance, the overproduction status and the dispositions broken out by code, none of which PDQ has. Restrict PDQ to oil_gas_code = 'O', and add the cycle to the join if you are joining month to month -- Historical Ledger -- Oil Lease Months carries cycle_yyyymm for exactly that, and without it both sides multiply by 378. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

historical-ledger-oil.district = pdq-lease-cycle.district_no AND historical-ledger-oil.lease_no = pdq-lease-cycle.lease_no

PDQ Lease Production by Cycle joins to Historical Ledger — Statewide Gas on District number = District and Lease number = Gas RRC ID — many rows here share a single row there.

produced, by month

PDQ carries a gas well as a lease keyed on the same RRC id, so this is the oil join again and it scores the same way: all 219,384 wells on this tape have PDQ cycles. MIND THE WET AND THE DRY. This tape's production is the WET volume charged against the allowable; PDQ's lease_gas_prod_vol is the dry one. In cycle 202406, production minus the code-9 (separation and extraction loss) disposition equals PDQ's figure on 141,447 of the 141,466 wells both carry, where comparing the raw volumes matches only 111,614. In 200506 all 103,045 wells reporting match on the key. Restrict PDQ to oil_gas_code = 'G', and add the cycle if you are joining month to month -- Historical Ledger -- Gas Well Months carries cycle_yyyymm for exactly that. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

historical-ledger-gas.district = pdq-lease-cycle.district_no AND historical-ledger-gas.gas_rrc_id = pdq-lease-cycle.lease_no

PDQ Lease Production by Cycle joins to Statewide Production Data — Oil on District number = District and Lease number = Lease number — many rows here share a single row there.

produced, by month

The join that puts the regulatory record beside the published volumes: what the lease was allowed to produce, and what PDQ says it produced. 4,619 of 5,000 sampled leases match; the missing 381 are leases on the production database that PDQ has no cycle for at all, usually because they have filed nothing in the window. Where both sides carry a figure they agree: in cycle 202506 the P-1 oil volume here is identical to lease_oil_prod_vol on 73,188 of the 73,271 leases matched. PDQ is the one to use for a long series; this tape is the one that is current, because PDQ's rows for 202606 onwards exist with every volume zero. Restrict PDQ to oil_gas_code = 'O': 122 of 5,000 sampled leases collide with a gas well of the same number in the same district. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

statewide-production-data-oil.district = pdq-lease-cycle.district_no AND statewide-production-data-oil.lease_no = pdq-lease-cycle.lease_no

PDQ Lease Production by Cycle joins to Statewide Production Data — Gas on District number = District and Lease number = Gas RRC ID — many rows here share a single row there.

produced, by month

PDQ carries a gas well as a lease keyed on the same RRC id, so this is the same join as the oil one and scores the same way: 4,775 of 5,000 sampled wells match. Two figures here are worth crossing. lease_gas_prod_vol is the DRY volume, identical to dry_gas_mcf on 119,974 of the 120,106 wells matched in cycle 202506 -- not to gas_prod_mcf, which is wet. And lease_gas_allow is the allowable in full, where this tape's balancing_allow_amt keeps only its low five digits. Restrict PDQ to oil_gas_code = 'G': 76 of 5,000 sampled wells collide with an oil lease of the same number in the same district. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

statewide-production-data-gas.district = pdq-lease-cycle.district_no AND statewide-production-data-gas.gas_rrc_id = pdq-lease-cycle.lease_no

PDQ Lease Production by Cycle joins to Oil Ledger — Leases on District name = District and Lease number = Lease number — many rows here share a single row there.

produced, by month

The join that puts the schedule beside the production: the allowable the ledger assigned against the volumes PDQ reports. Restrict the PDQ side to oil_gas_code = 'O' -- a gas well carries the same digits in the same lease_no column, and 298 of 5,000 sampled oil leases collide with one. 3,773 of 5,000 sampled leases match on the columns as they stand. The 1,227 that do not are every lease in 6E, 7B, 7C and 8A: the ledger writes 06E and PDQ writes 6E. Strip the leading zero and all 5,000 match. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

oil-ledger-leases.district = pdq-lease-cycle.district_name AND oil-ledger-leases.lease_no = pdq-lease-cycle.lease_no

PDQ Lease Production by Cycle joins to Gas Ledger — Wells on District name = District and Lease number = Gas RRC ID — many rows here share a single row there.

produced, by month

The gas schedule beside the gas production: PDQ carries a gas well as a lease, keyed on the same six-digit RRC id. Restrict the PDQ side to oil_gas_code = 'G' -- 43 of 5,000 sampled wells collide with an oil lease of the same digits. 4,200 of 5,000 match on the columns as they stand and all 5,000 once the district's leading zero is stripped. These two columns are different types — one is text, the other an integer — so a direct equality is rejected by Postgres. Cast the text side to integer, which also disposes of any leading zeros; casting the integer to text would not, because '000123' and 123 are not equal as text.

gas-ledger-wells.district = pdq-lease-cycle.district_name AND gas-ledger-wells.gas_rrc_id = pdq-lease-cycle.lease_no

PDQ Lease Production by Cycle joins to PDQ County Lease Production by Cycle on Oil gas code and District number and Lease number and Cycle year month — one row here matches many rows there.

is the county split of

A lease that crosses a county line has its production apportioned between counties. Summing the county split by lease double counts; use the lease cycle table for lease totals.

pdq-county-lease-cycle.oil_gas_code = pdq-lease-cycle.oil_gas_code AND pdq-county-lease-cycle.district_no = pdq-lease-cycle.district_no AND pdq-county-lease-cycle.lease_no = pdq-lease-cycle.lease_no AND pdq-county-lease-cycle.cycle_year_month = pdq-lease-cycle.cycle_year_month

PDQ Lease Production by Cycle joins to PDQ Lease Summary (master) on Oil gas code and District number and Lease number — many rows here share a single row there.

summarises the monthly production

The summary gives a lease's first and last production cycle; the cycle table gives every month in between. Read the summary first if you are about to scan 76 million rows.

pdq-lease-summary.oil_gas_code = pdq-lease-cycle.oil_gas_code AND pdq-lease-summary.district_no = pdq-lease-cycle.district_no AND pdq-lease-summary.lease_no = pdq-lease-cycle.lease_no

Where this comes from

Published by
Texas Railroad Commission — the original page
Original format
CSV Comma-separated text.
RRC publishes
Updated once a month (Last Saturday each month, with the PDQ dump.)
RRC download link
GoAnywhere MFT
Record layout manual
Our table
texas.pdq_og_lease_cycle

EZRRC is an independent mirror of public-domain data published by the Texas Railroad Commission. It is not affiliated with or endorsed by the RRC. For any legal or regulatory purpose, verify against the official RRC release.