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.

Cómo seleccionar y contar pares o tripletas de 5 columnas en PostgreSQL.

Tengo una tabla de PostgreSQL en la cual almaceno números en cinco columnas diferentes (digamos col1, col2, col3, col4, col5). En cada fila, los números almacenados son diferentes entre sí.

Quiero realizar una selección que me muestre las parejas que existen y cuántas veces aparecen (contar las veces que están presentes en las filas).

Ejemplo:

col1 col2 col3 col4 col5
1 5 10 20 100
5 20 30 40 100

Resultados (algo más o menos así):

pareja total
1,5 1
1,10 1
1,20 1
1,100 1
5,10 1
5,20 2
5,100 2
10,20 1
10,100 1
20,100 2
5,30 1
5,40 1
20,30 1
20,40 1

Puedo hacer una consulta SQL para ejecutar código en columnas específicas:

SELECT count (*) as total, col1, col2
FROM numbers
group by col1, col2;

Pero esto no me dará todas las combinaciones y no sé cómo obtener el resto de las parejas. Además, esto puede ser ineficiente en términos de rendimiento.

Cualquier ayuda será apreciada.

Saludos,
Miguel.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener todas las posibles parejas de números en las cinco columnas y contar su aparición, una posible solución es utilizar la función combinations del módulo itertools en Python.

    Podemos consultar la base de datos para recuperar todos los valores distintos de cada columna, y luego utilizar la función combinations para generar todas las posibles parejas de valores. Para cada pareja, podemos consultar la base de datos para contar el número de filas donde ambos valores aparecen, y generar una tabla con los resultados.

    Aquí hay un ejemplo de código en Python que hace esto:

    import psycopg2
    import itertools
    
    # conectarse a la base de datos
    conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword", host="localhost", port="5432")
    
    # recuperar valores distintos para cada columna
    cur = conn.cursor()
    cur.execute("SELECT DISTINCT col1 FROM numbers;")
    col1_values = [row[0] for row in cur.fetchall()]
    cur.execute("SELECT DISTINCT col2 FROM numbers;")
    col2_values = [row[0] for row in cur.fetchall()]
    cur.execute("SELECT DISTINCT col3 FROM numbers;")
    col3_values = [row[0] for row in cur.fetchall()]
    cur.execute("SELECT DISTINCT col4 FROM numbers;")
    col4_values = [row[0] for row in cur.fetchall()]
    cur.execute("SELECT DISTINCT col5 FROM numbers;")
    col5_values = [row[0] for row in cur.fetchall()]
    
    # generar todas las posibles parejas de valores
    pairs = list(itertools.combinations([col1_values, col2_values, col3_values, col4_values, col5_values], 2))
    
    # contar las apariciones de cada pareja
    results = []
    for pair in pairs:
        cur.execute("SELECT COUNT(*) FROM numbers WHERE %s=ANY(ARRAY[col1,col2,col3,col4,col5]) AND %s=ANY(ARRAY[col1,col2,col3,col4,col5]);", (pair[0], pair[1]))
        count = cur.fetchone()[0]
        if count > 0:
            results.append((pair, count))
    
    # mostrar resultados
    print("| pareja | total |")
    print("|--------|-------|")
    for r in results:
        print("| " + str(r[0][0]) + "," + str(r[0][1]) + " | " + str(r[1]) + " |")
    

    Este código debería mostrar una tabla similar a la del cuestionario original. Ten en cuenta que este código asume que las columnas de números se llaman col1, col2, col3, col4, col5 en la base de datos. Si tienen nombres diferentes, deberás ajustar las consultas SQL en consecuencia.

Comments are closed.