SQL(PostgreSQL)はあまり得意ではありません。これが私がやりたいことです:
テーブルとフィールドがあります:
id SERIAL
inet INET
ports integer[]
id | inet | ports
----+------------+------------
2 | 1.2.2.1 | {80}
1 | 1.2.3.4 | {80,12}
...
どうやって
このような:
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')
UNNEST
を使用できます。
select unnest(ports) as port, count(*) from foo group by port;
同じクエリ(または、とにかく同じ選択リスト)で複数のUNNESTを使用すると混乱を招き、おそらく回避するのが最善です。
可能な場合は、FROM
句でセットを返す関数を使用する方がきれいです。 SQL標準では、SELECT
リストにそれらを含めることはできません。また、LATERAL
ジョインがあるため、ほとんどの場合可能です。
SELECT port, count(*) AS ct
FROM tbl t, unnest(t.ports) AS port -- implicit LATERAL join
GROUP BY port;
しかし、私は「迅速かつ汚い」バリアント @ Jeffが提供される が通常速いことを認めなければなりません。