La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Devuelve customer_id y segment (de customers) para cada cliente con al menos un pedido completado realizado en noviembre de 2025 o en diciembre de 2025, una fila por cliente. Constrúyelo con dos SELECT, uno por mes.
- Lee de la tabla
customerspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
customer_idsegmentpendiente
Tu consulta
Cargando el editor…
Solución de referencia
| customer_id | first_name | last_name | city | |
|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Jordan, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
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 |
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 |
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
UNION ALL conserva todas las filas de todas las ramas. UNION (sin ALL) hace el mismo apilado y luego
elimina las filas duplicadas, como si hubieras envuelto el resultado en SELECT DISTINCT. Elegir entre
ellos es una pregunta sobre tus datos, no sobre estilo.
Los mismos datos, dos respuestas
Jordan quiere una fila por cliente de las fiestas. Contando de las dos maneras en Harbor & Pine:
SELECT COUNT(*) FROM (
SELECT customer_id FROM orders
WHERE status = 'completed' AND order_date >= '2025-11-01' AND order_date < '2025-12-01'
UNION
SELECT customer_id FROM orders
WHERE status = 'completed' AND order_date >= '2025-12-01' AND order_date < '2026-01-01'
) AS holiday;
Con UNION el conteo es 745. Con UNION ALL es 1,285, que es exactamente el número de pedidos completados
en esos dos meses: cada rama devuelve una fila por pedido, no por cliente. Por separado, 442 clientes
compraron en noviembre y 455 en diciembre, así que 442 + 455 − 745 = 152 personas compraron en ambos.
Ten en cuenta que UNION eliminó dos tipos de duplicados aquí: las repeticiones dentro de una rama
(un cliente con tres pedidos en noviembre) y las repeticiones entre ramas (un cliente en ambos meses).
Compara filas completas, así que customer_id más segment deben coincidir. Si añadieras order_date al
SELECT, casi ninguna fila sería igual y los duplicados volverían.
Clientes con y sin pedidos
UNION ALL con una etiqueta de estado construye una lista de clasificación a partir de dos conjuntos
disjuntos:
SELECT customer_id, 'with orders' AS status
FROM customers WHERE customer_id IN (SELECT customer_id FROM orders)
UNION ALL
SELECT customer_id, 'without orders'
FROM customers WHERE customer_id NOT IN (SELECT customer_id FROM orders);
Eso da 1,771 clientes con pedidos y 247 sin ellos (los 2,018 clientes). Los dos conjuntos no pueden
solaparse, así que UNION ALL es lo correcto, y se ahorra el trabajo de buscar duplicados.
Cuál usar
- Los conjuntos se solapan y quieres cada fila una vez (una audiencia, una lista de ids):
UNION. - Estás apilando eventos o montos que deben contarse todos (pedidos, reembolsos, sesiones):
UNION ALL. - Los conjuntos no pueden solaparse (grupos etiquetados y disjuntos):
UNION ALL, porque es más rápido.
Errores comunes
- UNION ALL para una lista de personas, de modo que los clientes aparecen una vez por pedido y reciben dos correos.
- UNION sobre montos, que fusiona en silencio dos reembolsos distintos de $49.00 en uno. El nivel 5 de este capítulo trata justo de ese fallo.
- Esperar que UNION deduplique por una columna. Compara todas las columnas seleccionadas juntas.
En SQL Server
UNION y UNION ALL se comportan igual. Para previsualizar la lista fusionada añadirías TOP 10 después
de la primera palabra clave SELECT en una consulta envolvente, donde DuckDB y Postgres usan LIMIT 10
al final.
¡Linterna encendida!
Practicaste: unionunion alldistinctset operations
- Resuelto
- Sin pistas
- Al primer intento
