获取停车数据的历史计数和当前计数

Get historical count and current count on parking data

我以前在 SO 上得到过关于分析停车数据的很好帮助。这是我的查询:

select parking_meter_id, avg(cnt) from
  (select parking_meter_id, count(*) as cnt, to_char(start,'YYYYMMDD') as day
  from parking_transactions
  where start >= now() - interval '3 month' -- last three months
  and to_char(start,'YYYYMMDD') < to_char(now(),'YYYYMMDD') -- but not today
  and to_char(start,'D') = to_char(now(),'D') -- same weekday
  and to_char(now(),'HH24MISS') between to_char(start,'HH24MISS') and to_char(stop,'HH24MISS') -- same time
  group by parking_meter_id, to_char(start,'YYYYMMDD') -- group by day
) as parking_transactions group by parking_meter_id

它确实有效并显示活跃交易的平均计数,这是因为今天 (now()) 的交易被过滤掉了。

是否有可能,在相同的 运行 中,查询也 return 当前活跃的交易:

select count(*) as cnt from parking_transactions where now() between start and stop

所以可以很容易地将当前状态与历史进行比较?

我的table结构是:

parking_meter_id, start, stop

目前我得到以下输出:

parking_meter_id, avg(cnt) minus today

我想要以下输出:

parking_meter_id, avg(cnt) minus today, count(*) for today only

-- 但不是今天是忽略今天交易的 where 子句。

目前的输出示例如下:

 parking_meter_id | cnt |   day    
------------------+-----+----------
             4406 |   1 | 20141217
             4406 |   5 | 20150107
             4406 |   1 | 20150121
             4406 |   3 | 20150128
             4406 |   3 | 20150114

我想 returned:

 parking_meter_id | avg(cnt-without-today) |   cnt-day    
------------------+-----+------------------------------
             4406 |   2.6                  | 3

使用 WITHdaily countavg count minus today 创建临时表并连接这些表以获得所需的结果

SQL Fiddle

SQL

WITH daily_count AS  -- temp table to store daily counts 
(
         SELECT   parking_meter_id,
                  COUNT(*)                  AS cnt,
                  to_char(start,'YYYYMMDD') AS day
         FROM     parking_transactions
         WHERE    start >= now() - interval '3 month' -- last three months
         AND      to_char(start,'D') = to_char(now(),'D') -- same weekday
         AND      to_char(now(),'HH24MISS') BETWEEN to_char(start,'HH24MISS') AND to_char(stop,'HH24MISS') -- same time
         GROUP BY parking_meter_id,
                  to_char(start,'YYYYMMDD') -- group by parking meter id and day
), avg_count_minus_today AS -- temp table to store avg count minus today 
(
         SELECT   parking_meter_id,
                  AVG(cnt) AS avg_count
         FROM     daily_count
         WHERE    day < to_char(now(),'YYYYMMDD') -- but not today
         GROUP BY parking_meter_id 
)
SELECT     a.parking_meter_id,
           a.avg_count, --avg count minus today
           d.cnt AS today_count
FROM       avg_count_minus_today a
INNER JOIN daily_count d
ON         a.parking_meter_id= d.parking_meter_id AND d.day=to_char(now(),'YYYYMMDD'); --today in daily count