2016-06-13 24 views
2

我有時間戳列:SQL(紅移):從時間戳列選擇每月不同的日期

time_column 
2016-02-02 08:09:59.351000 
2016-02-02 15:09:21.756000 
2016-02-02 15:42:33.287000 
2016-02-02 15:53:26.394000 

我想編寫輸出給定月份不同時間戳的查詢。

因此,輸出將

jan feb mar apr may jun  .... 
9  1  10 ... 

這是可能在SQL做,或者我需要(通過執行類似每個月計算不同date_trunc(...))運行每月分別查詢?

編輯:

基於建議看數據透視表,我試圖構建一個解決方案如下(但我相信有可能是紅移接受交叉的問題)。我希望真正的問題是我的查詢,而不是紅移。

SELECT * FROM crosstab(
$$SELECT 
    column1, 
    column2, 
    date_part('Month', my_timestamp) as month, 
    count(date_trunc('Month',my_timestamp)) 
FROM my_table 
GROUP BY column1, column2, month$$, 

$$SELECT m FROM generate_series(1,6) m$$ 
) AS (
       column1 CHARACTER VARYING, 
       column2 CHARACTER VARYING, 
       "Jan" INT, 
       "Feb" INT, 
       "Mar" INT, 
       "Apr" INT, 
       "May" INT, 
       "Jun" INT 
) 

拋出錯誤:

[42883] ERROR: function crosstab("unknown", "unknown") does not exist Hint: No function matches the given name and argument types. You may need to add explicit type casts.

+0

是的。它被稱爲轉軸表。在這裏搜索它,有成千上萬的例子。嘗試一下,然後,如果你不能做到這一點,告訴我們你的嘗試,所以我們會很樂意幫助你。 –

+0

@JorgeCampos謝謝。術語有所幫助。 – curious

+0

@JorgeCampos編輯添加。不知道問題是什麼。也許是一個紅移的特點? – curious

回答

0

不幸的是,紅移不支持旋轉操作(即交叉)。

您可以

  1. 做什麼豪爾赫提出評價和手動選擇所需的數據

  2. 如果數據足夠小,輸出入程序,並能轉動。

0

你可以做case語句的總和每月

select 
sum(case when extract('month' from time_column) = 1 then 1 else 0 end) Jan, 
sum(case when extract('month' from time_column) = 2 then 1 else 0 end) Feb, 
.... 
from table_name 
0

紅移不完全支持generate_series()或者(見https://stackoverflow.com/a/34167753/3019685)。

這會給你想要的數據,但不能格式化成一排:

select to_char(time_column, 'mon') as month, count(*) from your_table group by 1 

month | count 
-------+------- 
jun | 166 
feb |  1 
mar | 59 
may | 198 
apr | 231 
相關問題