Note
Tip: The ordering and pagination patterns below work the same way with views (like Sales) and cubes (like Orders).
Control the sort order of your results.
{ "order": { "Cube.measure_or_dimension": "asc" // or "desc" } }
{ "measures": ["Orders.net_sales"], "dimensions": ["Orders.location_id"], "order": { "Orders.net_sales": "desc" } }
Returns locations sorted by net sales (highest first).
{ "measures": ["Orders.net_sales"], "dimensions": ["Orders.location_id"], "order": { "Orders.location_id": "asc" } }
Returns locations sorted alphabetically.
{ "measures": ["Orders.net_sales"], "timeDimensions": [{ "dimension": "Orders.sale_timestamp", "dateRange": ["2024-01-01", "2024-01-31"], "granularity": "day" }], "order": { "Orders.sale_timestamp": "asc" } }
Returns days in chronological order.
{ "measures": ["Orders.net_sales"], "dimensions": ["Orders.location_id", "Orders.sales_channel_id"], "order": [ ["Orders.location_id", "asc"], ["Orders.net_sales", "desc"] ] }
Sorts by location first, then by net sales within each location.
Control the number of results returned.
{ "measures": ["Orders.net_sales"], "dimensions": ["Orders.location_id"], "limit": 10 }
Returns top 10 results.
{ "measures": ["Orders.net_sales"], "dimensions": ["Orders.location_id"], "limit": 10, "offset": 10 }
Returns results 11-20 (skips first 10).
async function fetchAllResults(baseQuery, pageSize = 100) { let allResults = []; let offset = 0; let hasMore = true; while (hasMore) { const query = { ...baseQuery, limit: pageSize, offset: offset }; const response = await executeQuery(query); allResults.push(...response.data); hasMore = response.data.length === pageSize; offset += pageSize; } return allResults; }
Warning
Use a stable sort key when paginating. If results are not sorted by a deterministic key, rows can shift between pages — causing duplicates or missed rows. Always include an order clause with a stable key (such as a unique dimension or a combination like timestamp + ID) when using limit/offset pagination.
Warning
Performance Consideration: Large result sets (>10,000 rows) may be slow. Consider:
- Adding filters to reduce scope
- Using fewer dimensions
- Increasing aggregation granularity (e.g., month instead of day)
{ "order": { "Orders.sale_timestamp": "asc" } }
For time-series data, ascending order shows progression over time.
{ "order": { "Orders.net_sales": "desc" } }
For rankings (top locations, top customers), descending order shows highest first.
{ "dimensions": ["Orders.location_id", "Orders.sales_channel_id"], "limit": 1000 }
Multiple dimensions can create thousands of rows—always limit results.
{ "limit": 100 // Good for UI display }
or
{ "limit": 1000 // Good for exports }
Avoid fetching unlimited results.
When paginating through results, always sort by a deterministic key:
{ "measures": ["Orders.net_sales"], "dimensions": ["Orders.order_id"], "order": { "Orders.order_id": "asc" }, "limit": 100, "offset": 0 }
Without a stable sort key, the database may return rows in a different order between pages, leading to duplicates or gaps.