配列integer []:テーブル内のすべての個別の値を取得してカウントする方法は?


9

SQL(PostgreSQL)はあまり得意ではありません。これが私がやりたいことです:

テーブルとフィールドがあります:

id SERIAL
inet INET
ports integer[]

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

どうやって

  1. このテーブルで使用されているすべての「ポート」値を取得します:80、12
  2. 特定のポートにあるinetアドレスの数を数えます:

このような:

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

誰かがDjangoバージョンを探している場合:

class Unnest(Func):
    function = 'UNNEST'

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

回答:


12

使用できますUNNEST

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

同じクエリ(または、とにかく同じ選択リスト)で複数のUNNESTを使用することは混乱を招き、おそらく回避するのが最善です。


4

FROM可能な場合は、句でset return関数を使用するほうがわかりやすくなります。SQL標準では、これらをSELECTリストに含めることはできません。そして、LATERAL参加しているので、ほとんどの場合それが可能です。

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

しかし、私は提供された「迅速かつ汚い」バリアント@Jeffが一般的に高速であることを認めなければなりません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.