Postgresql

數組整數: 如何獲取表中所有不同的值併計算它們?

  • December 27, 2018

我不太擅長 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')

您可以使用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 提供的“快速而骯髒”的變體通常更快

引用自:https://dba.stackexchange.com/questions/126412