2016-12-13 63 views
1

我正在使用帶有NodeJS的postgres和knex在給定日期範圍內將會話標識按小時聚合。我的start_timestamp格式爲2016-12-12 14:53:17.243-05。我想按小時對所有記錄進行分組,例如:knex SQL - 列必須出現在GROUP BY子句中或用於聚合函數中

  • 小時14:00:00-15:00:00在該小時內將有n條記錄。
  • 小時15:00:00-16:00:00在該小時內將有n條記錄。
  • 等...

鑑於查詢

db.knex.count('t1.id as session_ids') 
    .from('sessions as t1') 
    .where(db.knex.raw('t1.start_timestamp'), '>=', startDate) 
    .andWhere(db.knex.raw('t1.start_timestamp'), '<=', endDate) 
    .groupByRaw("date_trunc('hour', t1.start_timestamp)"); 

我的開始日期和結束日期決定的範圍1日。所以根據每天的小時分組不應該有重複/模糊的時間。

我成功地可以按小時來獲得每個記錄的計數:

[ anonymous { session_ids: '6' }, 
    anonymous { session_ids: '1' }, 
    anonymous { session_ids: '1' }, 
    anonymous { session_ids: '3' }, 
    ... 

但我需要顯示自己的實際時間,因爲這樣的:

{ 
    hour: 10 
    session_ids: 5 //5 session IDs 
} 

下面count添加.select('t1.start_timestamp'),如圖所示in this example,出現以下錯誤:

Unhandled rejection error: column "t1.start_timestamp" must appear in the GROUP BY clause or be used in an aggregate function

由於t1.start_timestamp出現在GROUP BY階段,所以此錯誤對我無意義。

此外,我已經檢查出PostgreSQL -must appear in the GROUP BY clause or be used in an aggregate function尋求幫助。我的記錄中沒有歧義,因此數據庫應該知道要選擇哪些記錄。

回答

0

我不熟悉knex,但下面的查詢不起作用(它給你指出了同樣的錯誤消息):

SELECT t1.start_timestamp, count(t1.id) AS session_ids 
FROM sessions AS t1 
GROUP BY date_trunc('hour', t1.start_timestamp); 

但是,下面的查詢不工作:

SELECT date_trunc('hour', t1.start_timestamp), count(t1.id) AS session_ids 
FROM sessions AS t1 
GROUP BY date_trunc('hour', t1.start_timestamp); 

你可以嘗試改變。相應地選擇?

相關問題