Table.Skip returns a table with the top rows removed, either a set number of rows or every row from the top that meets a condition. Available in Excel (Power Query), Power BI Desktop, and Power BI Service.
If you want to remove the first few rows of a table in Power Query, Table.Skip is the function you reach for. In this article, I’ll show you how to use it with five practical examples, including the classic messy-report cleanup.
Syntax of Table.Skip Function
Table.Skip(table as table, optional countOrCondition as any) as table
where
table(required, table). The source table to skip rows from.countOrCondition(optional, any). Controls how many rows get skipped. Omit it to skip just the first row. Pass a number to skip that many rows from the top. Pass a condition (aneachexpression) to skip rows from the top while the condition istrue, stopping at the first row where it isfalse.
Returns: a table containing every row of table except the skipped ones at the top. The remaining rows keep their original order, and all columns stay intact.
In plain terms, you point it at a table, tell it how many rows to drop from the top (or when to stop dropping), and it gives you back the rest.
Example 1: Skip a set number of rows
Say you have a Shipments table and the first two shipments have already been processed. You want to keep only the rows from the third one onward.
Here is the starting data:
| Shipment | Carrier | Weight |
|---|---|---|
| SH-2201 | Northwind Freight | 180 |
| SH-2202 | Coastal Express | 95 |
| SH-2203 | Northwind Freight | 240 |
| SH-2204 | Arrow Logistics | 132 |
| SH-2205 | Coastal Express | 75 |
Pass 2 as the second argument to skip the first two rows:
let
Source = Excel.CurrentWorkbook(){[Name="Shipments"]}[Content],
Result = Table.Skip(Source,2)
in
Result
The result keeps the last three shipments:
| Shipment | Carrier | Weight |
|---|---|---|
| SH-2203 | Northwind Freight | 240 |
| SH-2204 | Arrow Logistics | 132 |
| SH-2205 | Coastal Express | 75 |
The first two rows are gone, and everything below them comes through untouched.
Example 2: Skip the first row by omitting the argument
When you leave out the second argument, Table.Skip removes exactly one row.
Here, a Readings table starts with a calibration test entry that should not be part of the temperature data:
| Reading | Celsius |
|---|---|
| Calibration test | 0 |
| Morning | 18 |
| Noon | 24 |
| Evening | 21 |
Call Table.Skip with no second argument:
let
Source = Excel.CurrentWorkbook(){[Name="Readings"]}[Content],
Result = Table.Skip(Source)
in
Result
The result drops only the calibration row:
| Reading | Celsius |
|---|---|
| Morning | 18 |
| Noon | 24 |
| Evening | 21 |
Omitting countOrCondition is just shorthand for Table.Skip(Source,1).
Example 3: Skip rows with a condition
Instead of a number, you can pass a condition. Table.Skip then removes rows from the top for as long as the condition is true, and stops for good at the first row where it is false.
Here is a Tickets table sorted with the oldest tickets on top:
| Ticket | Status |
|---|---|
| MNT-101 | Closed |
| MNT-102 | Closed |
| MNT-103 | Open |
| MNT-104 | Closed |
| MNT-105 | Open |
Skip rows while the status is Closed:
let
Source = Excel.CurrentWorkbook(){[Name="Tickets"]}[Content],
Result = Table.Skip(Source,each [Status]="Closed")
in
Result
The result starts at the first ticket that is not closed:
| Ticket | Status |
|---|---|
| MNT-103 | Open |
| MNT-104 | Closed |
| MNT-105 | Open |
Notice that MNT-104 survives even though its status is Closed. The skipping stopped at MNT-103, so later matching rows are left alone. That’s the difference between skipping and filtering.
Example 4: Skip report preamble rows and promote headers
This is the most common real-world use of Table.Skip. Exported reports often arrive with title and metadata rows sitting above the actual column headers.
Here is a gym member export the way it lands in Power Query:
| Column1 | Column2 |
|---|---|
| Lakeside Gym – Member Export | null |
| Export period: FY26-Q1 | null |
| Member | Plan |
| Dana Whitfield | Annual |
| Marcus Lee | Monthly |
| Priya Nair | Annual |
Skip every row until the real header row appears, then promote it:
let
Source = Excel.CurrentWorkbook(){[Name="MemberExport"]}[Content],
Skipped = Table.Skip(Source,each [Column1]<>"Member"),
Result = Table.PromoteHeaders(Skipped,[PromoteAllScalars=true])
in
Result
The result is a clean table with proper headers:
| Member | Plan |
|---|---|
| Dana Whitfield | Annual |
| Marcus Lee | Monthly |
| Priya Nair | Annual |
Using a condition instead of Table.Skip(Source,2) makes the query robust. If the export grows an extra note row next quarter, the condition still finds the Member header and skips exactly the right amount.
Example 5: Skip more rows than the table has
What happens when the count is larger than the row count? Nothing bad. You just get an empty table back, no error.
Here is the starting data, a 3-row Snacks table:
| Item | Stock |
|---|---|
| Trail mix | 40 |
| Granola bars | 25 |
| Dried mango | 60 |
The query asks it to skip 10 rows, and Table.RowCount counts what is left:
let
Source = Excel.CurrentWorkbook(){[Name="Snacks"]}[Content],
Result = Table.RowCount(Table.Skip(Source,10))
in
Result
Result: 0
This makes Table.Skip safe to use with a computed count. You never need to guard against the count overshooting the table.
Things to keep in mind with Table.Skip
- The condition form is not a filter. It stops at the first non-matching row (Example 3). To remove every row that meets a condition, wherever it sits, use
Table.SelectRowswith the condition negated. - The UI writes this function for you. Home > Remove Rows > Remove Top Rows generates a
Table.Skipstep with a numeric count. Switch to a condition by editing the step in the formula bar. - Column names in the condition are case-sensitive.
each [status]="Closed"throwsExpression.Error: The field 'status' of the record wasn't found.when the column is namedStatus. Match the name exactly. - Be careful skipping right after a sort. Against foldable sources, the engine can reorder operations, so the skipped rows may not respect your
Table.Sortorder. Wrap the sorted table inTable.Bufferfirst when the skip must follow the sort.
Performance and query folding
With a numeric count, Table.Skip can fold to the source on some SQL databases as an OFFSET-style query. The condition form is evaluated row by row, so it typically runs locally. On Excel and CSV sources everything runs locally anyway, and the cost is negligible at workbook sizes.
Common questions about Table.Skip
What is the difference between Table.Skip and Table.RemoveFirstN?
They behave the same. Both accept a count or a condition and drop rows from the top. Table.RemoveFirstN is a documented twin, so use whichever reads better in your query.
What is the difference between Table.Skip and Table.FirstN?
They are opposites. Table.FirstN keeps the top rows and drops the rest, while Table.Skip drops the top rows and keeps the rest. Both accept a count or a condition.
How do I skip rows from the bottom instead?
Use Table.RemoveLastN. It takes the same count-or-condition argument but works from the end of the table upward.
List of All Power Query Functions
Related Power Query Functions / Articles: