La solicitud

De Nicole Bennett, Socia de Negocio de RR. HH.
Tu objetivo
Desde employees, devuelve employee_id, first_name, last_name, department y hire_date de la página 3 de un directorio con 10 empleados por página. El directorio se ordena por department ascendente (de la A a la Z), luego hire_date descendente (el más reciente primero), luego employee_id ascendente. La página 3 son las filas 21 a 30 de esa lista ordenada.
- Lee de la tabla
employeespendiente - Muestra exactamente
employee_idfirst_namelast_namedepartmenthire_datependiente - 10 filas, ordenadas como se pidependiente
Tu consulta
Cargando el editor…
Solución de referencia
| employee_id | first_name | last_name | department | title |
|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer |
| 2 | Robert | Kim | Executive | Chief Operating Officer |
| 3 | Megan | Collins | Sales | Head of Sales |
| 4 | Chloe | Gutierrez | Sales | Account Executive |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Nicole, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
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 |
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 |
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 |
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 |
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
La paginación combina dos ideas de este capítulo: un ordenamiento totalmente definido y un desplazamiento. Este directorio añade un giro: las claves de ordenamiento van en direcciones distintas.
Cada clave tiene su propia dirección
DESC no es un ajuste para todo el ORDER BY. Pertenece a la columna inmediatamente anterior, y toda
columna sin palabra clave es ascendente:
SELECT department, hire_date, employee_id
FROM employees
ORDER BY department ASC, hire_date DESC, employee_id ASC;
Las filas se ordenan primero por departamento. Solo entre las personas del mismo departamento decide hire_date DESC,
la más reciente primero. Solo si dos personas comparten ambos decidiría employee_id. En la tabla de
Harbor & Pine no hay dos personas del mismo departamento con la misma fecha de contratación, así que la última clave hoy no entra en juego, pero
garantiza que el orden siga fijo cuando se una alguien nuevo.
Las páginas son desplazamientos
Con 10 filas por página, la página n empieza después de (n - 1) * 10 filas:
LIMIT 10 OFFSET 20 -- rows 21 to 30, page 3
Aquí esa página empieza con Eric Lopez (Engineering, contratado el 2023-08-21), sigue con Catherine Hale y Robert Kim en Executive, y termina con cuatro empleados de Finance, el más reciente Jack Sanchez (contratado el 2024-05-03).
Errores comunes
- Esperar que
ORDER BY department, hire_date DESCordene los departamentos de forma descendente. No lo hace; solo hire_date es descendente. - Cambiar el ordenamiento entre páginas. La página tres solo tiene sentido si las páginas uno y dos usaron exactamente el mismo ORDER BY.
- Usar el número de página como desplazamiento,
OFFSET 3. Los desplazamientos cuentan filas, no páginas. - Omitir el desempate porque “hoy no hay empates”. La paginación es donde un desempate que falta más duele: si dos filas empatan en el borde de una página, una persona puede aparecer en ambas páginas y otra en ninguna, y nadie lo nota hasta que RR. HH. recibe una queja.
- Olvidar que un desplazamiento grande igual lee todas las filas saltadas. Para un directorio de 60 personas eso es nada, pero las apps que paginan millones de filas pasan a la paginación “keyset”: recuerdan la última fila mostrada y piden las filas posteriores.
En SQL Server
SQL Server pagina con OFFSET ... FETCH NEXT y exige un ORDER BY:
SELECT employee_id, department, hire_date
FROM employees
ORDER BY department ASC, hire_date DESC, employee_id ASC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY; ¡Linterna encendida!
Practicaste: order bymulti column sortasc desclimitoffsetpaging
- Resuelto
- Sin pistas
- Al primer intento
