La solicitud

De Ashley Rivera, Líder de Contenido Web
Tu objetivo
Desde products, devuelve product_id, name y unit_price de la página 2 de una lista de 12 productos por página, ordenada por unit_price ascendente y luego por product_id ascendente. La página 2 son las filas 13 a 24 de esa lista ordenada.
- Lee de la tabla
productspendiente - Muestra exactamente
product_idnameunit_pricependiente - 12 filas, ordenadas como se pidependiente
Tu consulta
Cargando el editor…
Solución de referencia
| product_id | name | category | subcategory | unit_price |
|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Ashley, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NULL | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NULL |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NULL |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NULL |
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NULL |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NULL |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NULL | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NULL | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
OFFSET n salta las primeras n filas del resultado ordenado. Junto con LIMIT, devuelve una página:
SELECT product_id, name, unit_price
FROM products
ORDER BY unit_price, product_id
LIMIT 12 OFFSET 12;
La cuenta de páginas
Para la página p (empezando en 1) con size filas por página:
LIMIT size OFFSET (p - 1) * size
La página 1 es OFFSET 0, la página 2 es OFFSET 12, la página 3 es OFFSET 24. Un error de uno aquí (usar
OFFSET 13 para la página 2) se salta un producto en silencio, que es justo el tipo de error que Ashley quiere
detectar.
El ordenamiento debe ser único
La paginación solo funciona si cada fila tiene una posición fija. Si diez productos cuestan $24.99 y ordenas solo por
precio, un producto podría aparecer tanto en la página 1 como en la 2, o en ninguna, porque la base de datos
puede ordenar las filas empatadas de forma distinta en cada petición. Terminar el ordenamiento con una columna única como
product_id lo soluciona. Este es un error real en aplicaciones en producción, no uno teórico.
Dialectos
- Postgres, DuckDB, MySQL, BigQuery:
LIMIT 12 OFFSET 12. - MySQL también acepta
LIMIT 12, 12(primero el desplazamiento, luego la cantidad), un orden confuso que conviene evitar. - Estándar SQL y SQL Server:
OFFSET 12 ROWS FETCH NEXT 12 ROWS ONLY.
OFFSET se vuelve lento en tablas grandes
Para devolver la página 5,000, la base de datos todavía tiene que producir y descartar las primeras 59,988 filas. Los ingenieros suelen cambiar a paginación por clave (keyset) en listas grandes: recuerdan la última fila de la página anterior y continúan desde ella.
SELECT product_id, name, unit_price
FROM products
WHERE (unit_price, product_id) > (24.99, 57)
ORDER BY unit_price, product_id
LIMIT 12;
La comparación de filas (a, b) > (x, y) funciona en Postgres, DuckDB y MySQL. Como analista, rara vez
escribirás paginación para una app, pero sí pasarás páginas por resultados de consultas en herramientas, y saber por qué
los OFFSET profundos se arrastran te ayuda a explicar paneles lentos.
Errores comunes
- Olvidar
ORDER BY. Paginar un resultado sin ordenar devuelve páginas arbitrarias y solapadas. - Confundir qué número es cuál.
LIMITes cuántas filas devolver;OFFSETes cuántas saltar primero.
En SQL Server
La paginación usa OFFSET ... ROWS FETCH NEXT ... ROWS ONLY, que solo se permite después de un ORDER BY:
SELECT product_id, name, unit_price
FROM products
ORDER BY unit_price, product_id
OFFSET 12 ROWS FETCH NEXT 12 ROWS ONLY; ¡Linterna encendida!
Practicaste: offsetpaginationlimit
- Resuelto
- Sin pistas
- Al primer intento
