簡體   English   中英

postgres工作日頻率按小時計算

[英]postgres weekday frequency by hours

我想生成一個類似下面的報告(來自Google Analytics App for Android的屏幕截圖)

我發生的事件每天發生10-15次,我希望每個工作日都能看到從一開始就以小時為單位的頻率。

我只需要使用名為“created_at”的DateTime(時間戳)字段(是一個Rails項目)

我怎么能在PostgreSQL中做到這一點?

謝謝

樣本輸出

這很容易。 您只需按一天中的小時和當天的日期分組,然后計算,有多少元素。 結果的前兩列(日期和日期的小時)是圖表中相應單元格的2D坐標。 第三列(計數)為您提供該單元格的顏色。

一個例子:

SELECT 
   extract('hour' FROM starttime) as hour, 
   date_trunc('day', starttime) as day,
   count(*) as nbmr
FROM actions
GROUP BY hour, day;

現場小提琴

在此示例中,“hour”和“day”列對應於圖表中單元格的y軸和x軸。 然后,列“nmbr”會告訴您該單元格的顏色。

您可以輕松修改此查詢,例如按工作日顯示百分比和組(0表示星期日):

SELECT 
   extract('hour' FROM starttime) as hour, 
   extract('dow' FROM starttime) as day,
   count(*) * 100.0 / (select count(*) from actions) as nbmr
FROM actions
GROUP BY hour, day;

現場小提琴

已經提供的答案都是正確的,但只是為了變化,這里使用' tablefunc '擴展來交叉列表結果,使其看起來完全符合您的樣本。

在使用它之前,您必須創建tablefunc擴展(在postgresql的contrib包中可用):

CREATE EXTENSION IF NOT EXISTS tablefunc;

這是查詢,假設輸入數據在表t的created_at列中:

SELECT * FROM CROSSTAB($$SELECT h.hour AS hour_of_day,
    dow.day AS day, 
    COUNT(t.created_at)::INT
FROM (values('Mon'),('Tue'),('Wed'),('Thu'),('Fri'),('Sat'),('Sun')) AS dow(day)
CROSS JOIN generate_series(0,23) as h(hour)
LEFT JOIN t ON to_char(t.created_at, 'Dy')=dow.day AND extract(hour from t.created_at)=h.hour
GROUP BY dow.day,h.hour
ORDER BY h.hour,dow.day$$) AS d(Hour int, "Mon" int,"Tue" int,"Wed" int,"Thu" int,"Fri" int,"Sat" int,"Sun" int);

要點:

  • 查詢交叉連接時間集與小時00-23的集合,以便即使輸入表中沒有給定單元格的數據,輸出中的所有單元格也都存在
  • 交叉表函數將SQL查詢作為輸入並交叉制表結果,從而生成記錄集
  • 由於我不完全清楚的原因,我不得不從count中轉換返回值(我猜它會以BIGINT的形式返回?)
  • 您(遺憾的是)必須通過AS子句拼寫結果中的列名,如圖所示

結果如下:

 hour | Mon | Tue | Wed | Thu | Fri | Sat | Sun
------+-----+-----+-----+-----+-----+-----+-----
    0 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    1 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    2 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    3 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    4 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    5 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    6 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    7 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    8 |   0 |   0 |   0 |   0 |   0 |   0 |   0
    9 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   10 |   0 |   0 |   0 |   0 |   0 |   0 |   1
   11 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   12 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   13 |   0 |   0 |   0 |   1 |   0 |   0 |   0
   14 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   15 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   16 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   17 |   0 |   0 |   1 |   0 |   0 |   0 |   0
   18 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   19 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   20 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   21 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   22 |   0 |   0 |   0 |   0 |   0 |   0 |   0
   23 |   0 |   0 |   0 |   0 |   1 |   0 |   0
(24 rows)

這是從這個示例數據生成的:

         created_at
----------------------------
 2014-06-12 23:06:03.746884
 2014-01-15 10:00:00
 2014-05-25 13:00:00
 2014-03-01 17:00:00
(4 rows)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM