Có chức năng tương đương trục trong PostgreSQL không?unpivot và PostgreSQL
Trả lời
Tôi đã viết một hàm hủy hợp lệ khủng khiếp cho PostgreSQL. Nó khá chậm nhưng ít nhất nó trả về các kết quả như bạn mong đợi một hoạt động tháo rời.
https://cgsrv1.arrc.csiro.au/blog/2010/05/14/unpivotuncrosstab-in-postgresql/
Hy vọng rằng bạn có thể tìm thấy nó hữu ích ..
Tạo một bảng ví dụ:
CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');
Bạn có thể 'UNPIVOT' hoặc 'uncrosstab' sử dụng UNION ALL:
SELECT id,
'a' AS colname,
a AS thing
FROM foo
UNION ALL
SELECT id,
'b' AS colname,
b AS thing
FROM foo
UNION ALL
SELECT id,
'c' AS colname,
c AS thing
FROM foo
ORDER BY id;
Điều này chạy 3 truy vấn phụ khác nhau trên foo
, một cho e cột ach mà chúng tôi muốn bỏ khóa và trả về trong một bảng, mỗi bản ghi từ mỗi truy vấn phụ.
Nhưng điều đó sẽ quét bảng N lần, trong đó N là số cột bạn muốn bỏ ghim. Điều này là không hiệu quả, và một vấn đề lớn khi, ví dụ, bạn đang làm việc với một bảng rất lớn mà phải mất một thời gian dài để quét.
Thay vào đó, sử dụng:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
này là dễ dàng hơn để viết, và nó sẽ chỉ quét bảng một lần.
array[a, b, c]
trả về đối tượng mảng, với các giá trị a, b và c làm phần tử của nó. unnest(array[a, b, c])
ngắt kết quả thành một hàng cho mỗi phần tử của mảng.
Hy vọng điều đó sẽ hữu ích!
Chiến lược 'unnest' rất hữu ích và hiệu quả trên các bảng lớn với 255 cột, cảm ơn! –
Có một giải pháp khác sử dụng mô-đun 'hstore' được mô tả trong blog này: http://www.postgresonline.com/journal/archives/283-Unpivoting-data-in-PostgreSQL.html –
FYI cho những người trong chúng ta đang tìm cách tháo gỡ trong RedShift.
Giải pháp dạng dài được đưa ra bởi Stew dường như là cách duy nhất để thực hiện việc này.
https://forums.aws.amazon.com/thread.jspa?threadID=126369
Đối với những người không thể nhìn thấy nó ở đó đây là nội dung được dán bên dưới ...
Chúng tôi không có chức năng tích hợp mà sẽ làm trục hoặc UNPIVOT. Tuy nhiên, bạn luôn có thể viết SQL để làm điều đó.
create table sales (regionid integer, q1 integer, q2 integer, q3 integer, q4 integer); insert into sales values (1,10,12,14,16), (2,20,22,24,26); select * from sales order by regionid; regionid | q1 | q2 | q3 | q4 ----------+----+----+----+---- 1 | 10 | 12 | 14 | 16 2 | 20 | 22 | 24 | 26 (2 rows)
truy vấn trục
create table sales_pivoted (regionid, quarter, sales) as select regionid, 'Q1', q1 from sales UNION ALL select regionid, 'Q2', q2 from sales UNION ALL select regionid, 'Q3', q3 from sales UNION ALL select regionid, 'Q4', q4 from sales ; select * from sales_pivoted order by regionid, quarter; regionid | quarter | sales ----------+---------+------- 1 | Q1 | 10 1 | Q2 | 12 1 | Q3 | 14 1 | Q4 | 16 2 | Q1 | 20 2 | Q2 | 22 2 | Q3 | 24 2 | Q4 | 26 (8 rows)
truy vấn UNPIVOT
select regionid, sum(Q1) as Q1, sum(Q2) as Q2, sum(Q3) as Q3, sum(Q4) as Q4 from (select regionid, case quarter when 'Q1' then sales else 0 end as Q1, case quarter when 'Q2' then sales else 0 end as Q2, case quarter when 'Q3' then sales else 0 end as Q3, case quarter when 'Q4' then sales else 0 end as Q4 from sales_pivoted) group by regionid order by regionid; regionid | q1 | q2 | q3 | q4 ----------+----+----+----+---- 1 | 10 | 12 | 14 | 16 2 | 20 | 22 | 24 | 26 (2 rows)
Hope this helps, Neil
- 1. UNPIVOT Pandas liệu
- 2. SQL Unpivot multiple columns Dữ liệu
- 3. Máy chủ SQL - Bao gồm NULL sử dụng UNPIVOT
- 4. Mảng Java và PostgreSQL
- 5. SQLAlchemy và Postgresql: to_tsquery()
- 6. Postgresql và ngoặc vuông
- 7. Mongodb và PostgreSql suy nghĩ
- 8. SQLAlchemy, Psycopg2 và PostgreSQL COPY
- 9. PostgreSQL và từ trò chơi
- 10. PostgreSQL 'NOT IN' và subquery
- 11. Các kiểu dữ liệu PostgreSQL và C#
- 12. chức năng PostgreSQL và gây nên
- 13. Tổng tích lũy hàng tháng và Postgresql
- 14. Hệ điều hành Android và postgreSQL
- 15. Thông báo PostgreSQL và WebSockets với Rails
- 16. Lỗi mã hóa với sqlalchemy và postgresql
- 17. PostgreSQL và tuần tự dữ liệu
- 18. PostgreSQL lồng nhau CTE và UNION
- 19. Heroku và PostgreSQL và Rails - quá nhiều kết nối lỗi
- 20. Các quy tắc và vấn đề tiếp theo() của PostgreSQL (rất cụ thể về PostgreSQL)
- 21. Cài đặt PostgreSQL 9.2 với Chef postgresql
- 22. Học PostgreSQL
- 23. chuỗi PostgreSQL
- 24. deadlock postgresql
- 25. ID đối tượng Postgresql và các bộ dữ liệu
- 26. khuôn khổ Yii và PostgreSQL chia bảng - 0 rows affected
- 27. PostgreSQL string (255) giới hạn - Rails, Ruby và Heroku
- 28. Ổ cắm miền PostgreSQL UNIX và ổ cắm TCP
- 29. Rails Postgresql nhiều lược đồ và cùng một tên bảng
- 30. PostgreSQL Kích hoạt và các hàng được cập nhật
Nó sẽ được tốt đẹp nếu bạn giải thích "unipivot" là những gì. –
@Milen A. Radev: Trong PostgreSQL, như @Bill Karwin ghi chú bên dưới, hàm crosstab() được sử dụng cho các hoạt động trục.Tài liệu cho biết: "Chức năng crosstab được sử dụng để tạo màn hình" xoay vòng ", trong đó dữ liệu được liệt kê trên trang chứ không phải là xuống". Vì vậy, bởi unpivot, tôi giả định @Tony Searle có nghĩa là "dữ liệu được liệt kê trên trang, chứ không phải là trên." Xem câu trả lời của tôi dưới đây. – Stew