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.

Consulta de PostgreSQL para obtener el recuento agregado de elementos distintos dentro de un arreglo

Me gustaría contar el número total de apariciones de cada etiqueta única en un array de cadenas a través de varias filas y hacerlo todo como parte de una consulta de PostgreSQL.

Estoy usando Prisma, pero sospecho que si es posible, tendría que hacerlo a través de $queryRaw.

En mi archivo schema.prisma, allTags está configurado como un array de cadenas:

  allTags                 String[]

Esto luego se convirtió en un _text en el esquema de la base de datos, y el guion bajo parece significar que es un array allí:

    "allTags" _text,

Entonces, suponiendo datos como estos:

{JavaScript, Vue.js}
{JavaScript, Node}
{TypeScript, JavaScript, Node}

…la salida debería verse algo así:

3     | JavaScript
2     | Node
1     | Vue.js
1     | TypeScript

Tengo la sensación de que quizás necesite usar una subconsulta aquí de alguna manera (he visto menciones de LATERAL), pero no puedo armarlo completamente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para contar el número total de ocurrencias de cada etiqueta única en una matriz de cadenas a lo largo de varias filas como parte de una consulta de PostgreSQL utilizando Prisma, puede utilizar el siguiente comando $queryRaw:

    SELECT count(*) as count, tag
    FROM (
      SELECT unnest(allTags) as tag
      FROM [tabla]
    ) as etiquetas
    GROUP BY tag
    ORDER BY count DESC;
    

    Aquí, reemplace [tabla] con el nombre de la tabla que está consultando. La función unnest se utiliza para expandir la columna de matriz en un conjunto de filas, y luego las filas resultantes se agrupan por tag antes de ser contadas y ordenadas en orden descendente por el recuento.

    Puede ejecutar esta consulta utilizando $queryRaw en Prisma al incluirla en el parámetro raw:

    const etiquetas = await prisma.$queryRaw`
      SELECT count(*) as count, tag
      FROM (
        SELECT unnest(allTags) as tag
        FROM [tabla]
      ) as etiquetas
      GROUP BY tag
      ORDER BY count DESC;
    `;
    
    

    Esto devolverá una matriz de objetos con las propiedades count y tag, que representan cada etiqueta única y su recuento en todas las filas de la tabla.

Comments are closed.