es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Categorizando columnas por percentiles de dos tablas en SQL

Tengo dos tablas que contienen datos sobre usuarios.

Necesito crear 3 grupos de usuarios, divididos por percentiles de las columnas de ambas tablas.

tabla_1:

user_no matches
3354 5
45744 30
21421 12
20121 50
21254 8
21454 2

tabla_2:

user_no level
3354 128
45744 37
21421 25
20121 11
21254 77
21454 3

Mi objetivo es presentar al final el user_no y una nueva columna llamada division, que se determina a partir del percentil promedio de ambas tablas.

Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para crear los 3 grupos de usuarios divididos por percentiles de columnas de ambas tablas, debemos seguir los siguientes pasos:

    1. Unir dos tablas basadas en la columna user_no
    2. Calcular el percentil de la columna matches para cada usuario de la tabla_1
    3. Calcular el percentil de la columna level para cada usuario de la tabla_2
    4. Encontrar el percentil promedio para cada usuario
    5. Dividir a los usuarios en 3 grupos basados en su percentil de división

    Paso 1: Unir dos tablas basadas en la columna user_no

    SELECT t1.user_no, t1.matches, t2.level
    FROM table_1 t1
    INNER JOIN table_2 t2
    ON t1.user_no = t2.user_no;
    

    Paso 2: Calcular el percentil de la columna matches para cada usuario de la tabla_1

    SELECT user_no, matches, 
    PERCENT_RANK() OVER (ORDER BY matches) AS matches_percentile
    FROM table_1;
    

    Paso 3: Calcular el percentil de la columna level para cada usuario de la tabla_2

    SELECT user_no, level, 
    PERCENT_RANK() OVER (ORDER BY level) AS level_percentile
    FROM table_2;
    

    Paso 4: Encontrar el percentil promedio para cada usuario

    SELECT t1.user_no, (t1.matches_percentile + t2.level_percentile)/2 AS division
    FROM (SELECT user_no, matches, 
          PERCENT_RANK() OVER (ORDER BY matches) AS matches_percentile
          FROM table_1) t1
    INNER JOIN (SELECT user_no, level, 
                PERCENT_RANK() OVER (ORDER BY level) AS level_percentile
                FROM table_2) t2
    ON t1.user_no = t2.user_no;
    

    Paso 5: Dividir a los usuarios en 3 grupos basados en su percentil de división

    WITH user_divisions AS (
      SELECT t1.user_no, (t1.matches_percentile + t2.level_percentile)/2 AS division
      FROM (SELECT user_no, matches, 
            PERCENT_RANK() OVER (ORDER BY matches) AS matches_percentile
            FROM table_1) t1
      INNER JOIN (SELECT user_no, level, 
                  PERCENT_RANK() OVER (ORDER BY level) AS level_percentile
                  FROM table_2) t2
      ON t1.user_no = t2.user_no
    )
    
    SELECT user_no, 
    CASE 
      WHEN division <= 0.33 THEN 'Grupo 1'
      WHEN division <= 0.66 THEN 'Grupo 2'
      ELSE 'Grupo 3'
    END AS group
    FROM user_divisions;
    

    Esta consulta devolverá el user_no y su grupo correspondiente basado en su percentil de división. La columna division se calcula tomando el percentil promedio de las columnas matches y level para cada usuario.

Comments are closed.