2016-02-26 22 views
1

注意:在PostgreSQL 9.4如何在PostgreSQL的一天中創建一個顯示「出現次數」的僞列?

比方說,我有一個這樣的表:

  • project_name:文本,而不是空;
  • date:沒有時區的時間戳,不爲空;
  • uuid:UUID,not null;
  • 所有三列的唯一索引。

比方說,對於一個給定project_name,有幾個date發生在同一天。例如:

uuid  | project_name | analysis_date 
-------------|------------------------------------ 
uuid-1-here | MY_PROJECT | 2016-02-22 10:00:00 
uuid-2-here | MY_PROJECT | 2016-02-22 10:20:00 
uuid-3-here | MY_PROJECT | 2016-02-24 13:12:00 

而這個圖形可重複:我可以有幾個分析了,說2月23日,一月十二日,二零一五年十二月三十零日,等等等等

我想獲得像輸出這樣的:

uuid  | project_name | analysis_day | occurrence 
-------------|------------------------------------------ 
uuid-1-here | MY_PROJECT | 2016-02-22 |  1 
uuid-2-here | MY_PROJECT | 2016-02-22 |  2 
uuid-3-here | MY_PROJECT | 2016-02-24 |  1 

也就是說,每個天,有僞列occurrence表明發生當天分析號碼 - 每一天。

好的,所以,格式爲analysis_day我可以管理;但我沒有絲毫的想法如何生成occurrence列:(

我的第一讀書告訴我,我應該使用某種PARTITION,但這是SQL的一部分,完全沒有我,並且那doesn 「T幫助也許分區是在這裏甚至沒有解決

我怎樣才能實現上述

+1

使用分析函數,例如從tableName窗口函數中選擇uuid,project_name,analysis_day,row_number()over(由project_name劃分的分區,由uuid分析的order_order)。非常酷和強大的東西! – xQbert

+1

嘗試使用'row_number()over(partition by project_name,analysis_day ORDER BY uuid)作爲發生' – krokodilko

回答

2

這聽起來像你只需要GROUP BY:?

SELECT uuid, project_name, to_char(analysis_date, 'YYYY-MM-DD') d, count(*) 
FROM t 
GROUP BY uuid, project_name, d 
ORDER BY uuid, project_name, d 
; 

編輯

好吧,我意識到你並不是要求計數,而是要求序列號。在這種情況下,你可以這樣說:

SELECT uuid, project_name, to_char(analysis_date, 'YYYY-MM-DD') d, 
     row_number() OVER (PARTITION BY analysis_date::date ORDER BY analysis_date) 
FROM t 
ORDER BY uuid, project_name, d 
; 

或者,如果你想在每個項目中的獨立編號,包括在PARTITION這樣的:PARTITION BY project_name, to_char(analysis_date, 'YYYY-MM-DD')

請注意,您將在此遇到時區問題,因爲Postgres必須決定每一天的開始時間和結束時間。由於您有TIMESTAMP WITHOUT TIME ZONE,因此不會根據客戶端的時區設置進行自動轉換。

+0

「時間戳沒有時區」是客戶要求的,我建議反對它,但這是客戶的選擇:p – fge

+0

那麼在Postgres帶時區的時間戳* *實際上並不存儲時區*!它只是告訴Postgres用客戶端的時區格式化/解析字符串,並在決定瞬間屬於哪一天時使用它。 –

+0

是的,現在已經太晚了:/但是我不知道......有用的精確度,謝謝! – fge

相關問題