2015-11-04 69 views
0

(背景:我试图在一系列cameraapis中查找活动的“高峰”小时,定义为开始和结束日期在1之间的项目最多(从小时开始)例如,1:00到2:00在该时间范围内可能有8个条目,但2:00到3:00有12个条目 - 所以我想让它返回12输入时间范围)。为PostgreSQL的组中的某个选择获取对应的值

我无法从组的SELECT查询中获取关联数据。下面是代码:

def reach_peak_hour_by_date_range(start_date, end_date) 
    placement_self_device_id = self.device_id 
    query = <<-SQL 
    SELECT max(y.num_entries) AS max_entries 
    FROM 
    ( 
    SELECT x.starting_hour, count(*) AS num_entries 
    FROM 
    (
     SELECT date_trunc('hour', visitor_start_time) starting_hour 
     FROM Cameraapis WHERE device_id = '#{placement_self_device_id}'::text AND visitor_start_time > '#{start_date}'::timestamp AND visitor_end_time < '#{end_date}'::timestamp 
    ) AS x 
    GROUP BY x.starting_hour 
) AS y 
    SQL 
    results = Placement.connection.execute(query) 
    binding.pry 
end 

Cameraapi有一个DEVICE_ID,visitor_start_time和visitor_end_time,在代码中引用。

此代码在1小时内成功返回max_entries,但我无法弄清楚要将关联的start_hour选择到该max_entries。因为它是一个组,所以它需要聚合函数,而实际上我并不需要这些函数。有什么建议?

+0

你有没有考虑把这部分到红宝石? –

+0

你的问题需要更多的上下文,现在解码有点困难。但是为什么不在你的select语句中使用聚合函数:array_agg(expression)来提取你需要的id? – charlysisto

回答

0

didnt很明白的问题...使用窗口功能

select starting_hour , num_entries from (
    SELECT starting_hour ,y.num_entries, max(y.num_entries) over() AS  max_entries 
    FROM 
    ( 
     SELECT x.starting_hour, count(*) AS num_entries 
     FROM 
     (
     SELECT date_trunc('hour', visitor_start_time) starting_hour 
     FROM Cameraapis WHERE device_id = '#{placement_self_device_id}'::text AND visitor_start_time > '#{start_date}'::timestamp AND visitor_end_time < '#{end_date}'::timestamp 
     ) AS x 
     GROUP BY x.starting_hour 
    ) AS y 
    ) as u 
    where num_entries = max_entries 

该查询返回与高峰时间相关联的所有条目,你可以修改它返回唯一入口关联小时选择小时数,并使用不同的计算或分组

select * from 
(
select x.*, max(num_entries) over()as max_num_entries from 
(
    SELECT Cameraapis.* ,date_trunc('hour', visitor_start_time) as starting_hour, count(*) over(partition by date_trunc('hour', visitor_start_time)) as num_entries 
    FROM Cameraapis WHERE device_id = '#{placement_self_device_id}'::text AND visitor_start_time > '#{start_date}'::timestamp AND visitor_end_time < '#{end_date}'::timestamp 
) as x 
) as x where max_num_entries = num_entries