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
3 Réponses :
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
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)
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 >
Sans rapport avec votre question, mais
count (1)
est en fait plus lent quecount (*)