Array integer []: come ottenere tutti i valori distinti in una tabella e contarli?


9

Non sono così bravo con SQL (PostgreSQL). Ecco cosa voglio fare:

Ho una tabella, campi:

id SERIAL
inet INET
ports integer[]

 id |    inet    | ports 
----+------------+------------
  2 | 1.2.2.1    | {80}
  1 | 1.2.3.4    | {80,12}
  ...

Come posso

  1. ottenere tutti i valori "port" usati in questa tabella: 80, 12
  2. conta quanti indirizzi inet si trovano su una porta specifica:

Come questo:

  port  | count
--------+------------
 12     | 1
 80     | 2
  ...

Se qualcuno è alla ricerca di una versione di Django:

class Unnest(Func):
    function = 'UNNEST'

Model.objects \
.annotate(port=Unnest('ports', distinct=True)) \
.values('port') \
.annotate(count=Count('port')) \
.order_by('-count', '-port')

Risposte:


12

È possibile utilizzare UNNEST.

select unnest(ports) as port, count(*) from foo group by port;

L'uso di più UNNEST nella stessa query (o lo stesso elenco di selezione, comunque) è fonte di confusione ed è probabilmente meglio evitarlo.


4

Se possibile, è più pulito utilizzare le funzioni di restituzione impostate nella FROMclausola. Lo standard SQL non li consente SELECTnell'elenco. Ed è quasi sempre possibile poiché abbiamo LATERALaderenze.

SELECT port, count(*) AS ct
FROM   tbl t, unnest(t.ports) AS port  -- implicit LATERAL join
GROUP  BY port;

Ma devo ammettere che la variante "quick-and-dirty" fornita da @Jeff è in genere più veloce .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.