Postgresql
數組整數: 如何獲取表中所有不同的值併計算它們?
我不太擅長 SQL (PostgreSQL)。這是我想做的事情:
我有一個表,欄位:
id SERIAL inet INET ports integer[] id | inet | ports ----+------------+------------ 2 | 1.2.2.1 | {80} 1 | 1.2.3.4 | {80,12} ...
我怎樣才能
- 獲取此表中所有使用的“埠”值:80、12
- 計算特定埠上有多少 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')
您可以使用
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 提供的“快速而骯髒”的變體通常更快。