1. Faro

Nivel 8 · Desafío final: listas de merchandising para la página de inicio

La solicitud

De Ashley Rivera, Líder de Contenido Web

“La nueva página de inicio tiene tres franjas de productos y necesito los datos de cada una: nuestras piezas de iluminación más caras, nuestros lanzamientos activos más nuevos y la segunda fila de opciones económicas.”

Tu objetivo

Paso 1 de 3. Desde products, devuelve product_id, name y unit_price de los 5 productos activos más caros de la categoría 'Lighting'. Ordena por unit_price descendente y luego por product_id ascendente.

  • Lee de la tabla productspendiente
  • Muestra exactamente product_id name unit_pricependiente
  • 5 filas, ordenadas como se pidependiente

Paso 1 · tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de products · presiona Ejecutar para ver el tuyo
    Vista previa de products
    product_idnamecategorysubcategoryunit_price
    101Vale Velvet LoveseatFurnitureSofas1659.00
    102Alder Oak Coffee TableFurnitureTables919.00
    103Orchard Rattan Dining ChairFurnitureChairs789.00
    104Upland Oak BookcaseFurnitureStorage429.00

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    Paso 2 · tu consulta

    SQL

    Cargando el editor…

      ResultadoVista previa de products · presiona Ejecutar para ver el tuyo
      Vista previa de products
      product_idnamecategorysubcategoryunit_price
      101Vale Velvet LoveseatFurnitureSofas1659.00
      102Alder Oak Coffee TableFurnitureTables919.00
      103Orchard Rattan Dining ChairFurnitureChairs789.00
      104Upland Oak BookcaseFurnitureStorage429.00

      Mote revisa tu resultado

      Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

      Paso 3 · tu consulta

      SQL

      Cargando el editor…

        ResultadoVista previa de products · presiona Ejecutar para ver el tuyo
        Vista previa de products
        product_idnamecategorysubcategoryunit_price
        101Vale Velvet LoveseatFurnitureSofas1659.00
        102Alder Oak Coffee TableFurnitureTables919.00
        103Orchard Rattan Dining ChairFurnitureChairs789.00
        104Upland Oak BookcaseFurnitureStorage429.00

        Mote revisa tu resultado

        Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

        Tablas

        Datos de la tienda Harbor & Pine, listos para consultar.

        products120 filas · 8 columnas
        • product_idinteger
        • namevarchar
        • categoryvarchar
        • subcategoryvarchar
        • unit_pricedecimal
        • unit_costdecimal
        • launched_ondate
        • is_activeboolean
        Primeras 5 filas de products
        product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
        101Vale Velvet LoveseatFurnitureSofas1659.00NULL2023-09-11true
        102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
        103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
        104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
        105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
        customers2,018 filas · 9 columnas
        • customer_idinteger
        • first_namevarchar
        • last_namevarchar
        • emailvarchar
        • cityvarchar
        • statevarchar
        • signup_datedate
        • segmentvarchar
        • referral_sourcevarchar
        Primeras 5 filas de customers
        customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
        1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
        2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNULL
        3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNULL
        4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
        5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNULL
        orders12,000 filas · 7 columnas
        • order_idinteger
        • customer_idinteger
        • order_datetimestamp
        • statusvarchar
        • channelvarchar
        • shipping_feedecimal
        • coupon_codevarchar
        Primeras 5 filas de orders
        order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
        10011252023-01-01 20:51:19completedweb0.00NULL
        10021562023-01-02 07:58:46completedweb0.00NULL
        1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
        1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
        1005822023-01-02 11:43:36completedweb0.00WELCOME10
        order_items30,338 filas · 6 columnas
        • order_item_idinteger
        • order_idinteger
        • product_idinteger
        • quantityinteger
        • unit_pricedecimal
        • discount_pctdecimal
        Primeras 5 filas de order_items
        order_item_idorder_idproduct_idquantityunit_pricediscount_pct
        11001121931.990.00
        21001154311.990.00
        31002154411.990.00
        410021941149.000.00
        51002193219.990.00
        returns1,673 filas · 5 columnas
        • return_idinteger
        • order_item_idinteger
        • returned_ondate
        • reasonvarchar
        • refund_amountdecimal
        Primeras 5 filas de returns
        return_idorder_item_idreturned_onreasonrefund_amount
        1142023-01-10damaged83.69
        2422023-01-10wrong_item19.99
        31052023-01-14wrong_item10.99
        4242023-01-16changed_mind26.99
        51262023-01-16late20.99
        employees60 filas · 8 columnas
        • employee_idinteger
        • first_namevarchar
        • last_namevarchar
        • departmentvarchar
        • titlevarchar
        • manager_idinteger
        • hire_datedate
        • salaryinteger
        Primeras 5 filas de employees
        employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
        1CatherineHaleExecutiveChief Executive OfficerNULL2016-03-01285000
        2RobertKimExecutiveChief Operating Officer12017-01-09235000
        3MeganCollinsSalesHead of Sales12018-04-16172000
        4ChloeGutierrezSalesAccount Executive32020-01-2172000
        5FrankBellSalesAccount Executive32023-05-2173000
        web_sessions40,000 filas · 7 columnas
        • session_idinteger
        • customer_idinteger
        • started_attimestamp
        • devicevarchar
        • sourcevarchar
        • pages_viewedinteger
        • convertedboolean
        Primeras 5 filas de web_sessions
        session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
        1NULL2023-01-01 23:02:24mobilepaid1false
        2182023-01-01 15:07:49desktoppaid1false
        3NULL2023-01-01 16:55:46desktopdirect7false
        4NULL2023-01-01 12:43:28mobileorganic3false
        5NULL2023-01-01 13:06:21mobilesocial2false
        marketing_spend3,276 filas · 3 columnas
        • spend_datedate
        • channelvarchar
        • amountdecimal
        Primeras 5 filas de marketing_spend
        spend_datechannelamount
        2023-01-01paid492.99
        2023-01-01email37.38
        2023-01-01social200.53
        2023-01-02paid709.13
        2023-01-02email64.13

        La lección

        Cada franja de la página de inicio es una lista top N, lo que implica tres decisiones cada vez: qué filas califican, cómo ordenarlas y cuántas conservar. El orden de las cláusulas importa:

        SELECT ...
        FROM products
        WHERE ...        -- 1. which rows qualify
        ORDER BY ...     -- 2. sort, with a tie-breaker
        LIMIT ... OFFSET ...;  -- 3. how many, starting where

        La base de datos filtra primero, luego ordena y después corta. Así que “los 5 productos de Lighting más caros” no es “los 5 productos más caros y luego quedarse con los de Lighting”. Si ordenaras todos los productos y limitaras antes de filtrar, podrías terminar con cero filas de Lighting. El orden de las cláusulas de SQL hace lo correcto siempre que la condición esté en WHERE.

        Paso 1: la iluminación más cara

        Filtra los productos activos de Lighting, ordena por precio descendente y conserva 5. El desempate product_id ASC importa si dos lámparas comparten precio en la posición 5.

        Paso 2: los lanzamientos más nuevos

        launched_on es un DATE, y varios productos pueden lanzarse el mismo día, así que los empates son probables. product_id DESC los desempata, una opción razonable porque los ID más altos se crearon después. En un ticket real, di qué desempate usaste para que Ashley no se lleve una sorpresa.

        Paso 3: la segunda franja

        La franja muestra 6 artículos, y Ashley quiere la segunda, así que salta 6 y toma 6. Aplica el filtro de precio antes de paginar. Un producto de exactamente $40 no es “menor a 40”, así que < 40 es lo correcto.

        Productos inactivos

        Las tres franjas filtran por is_active. Los productos descontinuados nunca deberían promocionarse, y olvidar la bandera es una de las razones más comunes por las que una página de inicio enlaza a una página sin stock. Cuando construyas cualquier lista de cara al cliente, pregúntate si hay que excluir artículos inactivos u ocultos.

        Revisa tu propio trabajo

        Antes de enviar resultados como estos, dedica diez segundos a comprobaciones de sentido común:

        • ¿El paso 1 muestra solo Lighting y los precios van bajando?
        • ¿El paso 2 muestra solo productos activos, con las fechas bajando?
        • ¿La primera fila del paso 3 cuesta al menos lo mismo que la sexta fila de la primera franja?

        A los entrevistadores les encantan los candidatos que revisan su resultado sin que se lo pidan. En el trabajo, es lo que mantiene tu nombre fuera del hilo de “¿quién envió esto?”.

        Errores comunes

        • Olvidar DESC. ORDER BY unit_price ordena del más barato al más caro, así que el “top 5” se vuelve las 5 lámparas más baratas.
        • Paginar con el offset equivocado. La segunda franja de 6 es LIMIT 6 OFFSET 6. OFFSET 7 se salta un producto y OFFSET 1 repite cinco productos de la primera franja.
        • Omitir el desempate. Sin product_id en el ORDER BY, dos productos empatados en el punto de corte pueden intercambiar lugares entre ejecuciones, y la franja cambia sin motivo.
        • Escribir unit_price <= 40 para “menos de $40”. Un producto de exactamente $40 no está por debajo de 40; usa < 40.

        En SQL Server

        Los pasos 1 y 2 se convierten en SELECT TOP 5 ... y SELECT TOP 8 ..., el paso 3 usa OFFSET 6 ROWS FETCH NEXT 6 ROWS ONLY, e is_active es un BIT, así que el filtro se lee WHERE is_active = 1. Las claves de ordenamiento y los desempates se mantienen igual.

        Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.