Số nguyên mảng []: làm thế nào để có được tất cả các giá trị riêng biệt trong một bảng và đếm chúng?


9

Tôi không giỏi lắm với SQL (PostgreSQL). Đây là những gì tôi muốn làm:

Tôi có một bảng, các lĩnh vực:

id SERIAL
inet INET
ports integer[]

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

Làm thế nào tôi có thể

  1. nhận tất cả các giá trị "cổng" đã sử dụng trong bảng này: 80, 12
  2. đếm có bao nhiêu địa chỉ inet trên cổng cụ thể:

Như thế này:

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

Nếu bất cứ ai đang tìm kiếm một phiên bản Django của nó:

class Unnest(Func):
    function = 'UNNEST'

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

Câu trả lời:


12

Bạn có thể sử dụng UNNEST.

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

Việc sử dụng nhiều hơn một UNNEST trong cùng một truy vấn (hoặc cùng một danh sách chọn) là khó hiểu và có lẽ tốt nhất nên tránh.


4

Nó sạch hơn để sử dụng các hàm trả về được đặt trong FROMmệnh đề nếu có thể. Tiêu chuẩn SQL không cho phép chúng trong SELECTdanh sách. Và hầu như luôn luôn có thể kể từ khi chúng tôi LATERALtham gia.

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

Nhưng tôi phải thừa nhận rằng biến thể "nhanh và bẩn" mà @Jeff cung cấp thường nhanh hơn .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.