我試圖找出每年發生多少事件。目前我有這個查詢,基本上當一個事件有訪問者時計算:
SELECT
count(visitors_y_2016) as y_16,
count(visitors_y_2017) as y_17,
count(visitors_y_2018) as y_18,
count(visitors_y_2019) as y_19,
count(visitors_y_2020) as y_20
FROM event
;
y16 y17 y18 y19 y20
23 25 26 27 19
但我正在尋找的是按年訂購的帶有更多活動的訂單:
Y19 27
Y18 26
y17 25
y16 23
y20 19
知道如何實作嗎?
uj5u.com熱心網友回復:
您的表格設計看起來很奇怪,因為這些資訊應該在行而不是列中。
但是你可以UNION對所有結果進行排序
CREATE TABLE event (visitors_y_2016 int,visitors_y_2017 int,visitors_y_2018 int,visitors_y_2019 i
(SELECT 'y_16' ,count(visitors_y_2016) as cnt FROM event UNION ALL SELECT 'y_17',count(visitors_y_2017) FROM event UNION ALL SELECT 'y_18', count(visitors_y_2018) FROM event UNION ALL SELECT 'y_19', count(visitors_y_2019) FROM event UNION ALL SELECT 'y_20', count(visitors_y_2020) FROM event) ORDER BY cnt ;
?柱子?| cnt :------- | --: y_16 | 0 y_17 | 0 y_18 | 0 y_19 | 0 y_20 | 0
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以使用子查詢VALUES中的運算式“取消透視” :LATERAL
SELECT t.*
FROM (
SELECT count(visitors_y_2016) AS y16
, count(visitors_y_2017) AS y17
, count(visitors_y_2018) AS y18
, count(visitors_y_2019) AS y19
, count(visitors_y_2020) AS y20
FROM event
) e, LATERAL (
VALUES
(16, e.y16)
, (17, e.y17)
, (18, e.y18)
, (19, e.y19)
, (20, e.y20)
) t(year, count)
ORDER BY count DESC; -- your desired sort order
db<>在這里擺弄
由于這只需要對表進行一次掃描,因此它比單獨聚合曾經的輸出值快很多倍。
運算式中的每一行VALUES形成一個包含兩列的行:(year數字默認為integer)和count(參考列的型別)。
看:
- 查詢交叉表視圖
- 在多列上選擇 DISTINCT
關于LATERAL子查詢:
- LATERAL JOIN 和 PostgreSQL 中的子查詢有什么區別?
但是你的桌子設計提出了問題。通常你會有一個日期或時間戳列visitors而不是visitors_y_2016等visitors_y_2017- 以及基于該的更簡單的查詢......
uj5u.com熱心網友回復:
我認為您不需要每年進行選擇。我不完全了解您的表格,但應該有更好的方式來組織您的資料。此外,如果您想對資料進行排序,SORT BY 應該是您的朋友。您只需要一個 SELECT 即可使用它,例如:
SORT BY
VISITOR_COUNT
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/450554.html
標籤:sql PostgreSQL 排序
