1
votes

comment compter les valeurs particulières d'un tableau dans postgresql

J'ai une table appelée "Utilisateur" où elle contient les détails ou user_id et product_item_code.

ex:

select count(1) from Users where ARRAY[556, 990, 623] @> ANY(product_item_code);

Je veux compter ces product_item_code 556, 990 , 623. Combien de fois cela a été répété.

Je cherche une requête pour me donner une sortie comme ci-dessous

+-------------------+-------+
| product_item_code | count |
+-------------------+-------+
|               556 |     5 |
|               990 |     3 |
|               623 |     2 |
+-------------------+-------+

J'ai essayé ce qui suit code mais n'a pas pu obtenir le résultat attendu.

Select * from Users limit 5;
+----+---------+---------------------------+
| id | user_id |     product_item_code     |
+----+---------+---------------------------+
|  1 |     123 | {556,772,945}             |
|  2 |     124 | {556,965,945,990}         |
|  3 |     125 | {772, 435, 990, 556}      |
|  4 |     126 | {556, 623, 842}           |
|  5 |     127 | {842, 990, 556, 623, 745} |
+----+---------+---------------------------+

S'il vous plaît laissez-moi savoir comment puis-je obtenir le résultat ci-dessus. Merci d'avance


1 commentaires

Sans rapport avec votre question, mais count (1) est en fait plus lent que count (*)


3 Réponses :


2
votes

Vous pouvez utiliser des valeurs de tableau unnest , puis les compter, comme:

select u, count(*) from users
join lateral unnest(product_item_code) u on true
where
u in(556, 990, 623)
group by u
order by count(*) desc


0 commentaires

0
votes

Utilisez unnest pour transformer les tableaux en lignes, puis group by product_item_code pour obtenir vos décomptes:

=# with expand as (
  select unnest(product_item_code) as product_item_code
    from users
)
select product_item_code, count(*)
  from expand
 where product_item_code in (556, 990, 623)
 group by product_item_code
 order by count(*) desc;

 product_item_code | count
-------------------+-------
               556 |     5
               990 |     3
               623 |     2
(3 rows)


0 commentaires

1
votes

Pas besoin de désnnister. En supposant qu'un élément donné n'apparaît jamais deux fois dans un tableau donné, vous pouvez énumérer les valeurs dans une table dérivée, joindre avec any () et agréger:

select p.code, count(*) cnt
from (values (556), (990), (223)) p(code)
inner join users u on p.code = any(u.product_item_code)
group by p.code

p >


0 commentaires