2

IDタグが付けられ、座標と呼ばれる2番目のテーブルに保持されている約2600の4タプル緯度/経度値を渡すCTEベースのクエリがあります。これらの左上と右下の緯度/経度の値は、指定された 2 つのタイムスタンプに対してこれらの座標内で行われた (1 時間ごとの) リクエストの量を表示するために CTE に渡されます)。

ただし、指定されたタイムスタンプ内で 1 日あたりの合計リクエストを取得したいと考えています。つまり、指定した日ごとにユーザー リクエストの総数を取得したいと考えています。たとえば、ユーザーは毎週水曜日または水曜日と木曜日などを表示することを選択します。-通過するすべての緯度/経度 4 タプルについて、2012 年 1 月 1 日から 16 日までの 11:55 から 22:04 の間。出力は基本的に次のようになります。

coordinates_id | stamp       | zcount

1                Jan 4 2012    200 (total requests on Wednesday Jan 4 between 11:55 and 22:04)
1                Jan 11 2012   121 (total requests on Wednesday Jan 11 between 11:55 and 22:04)
2                Jan 4 2012    255 (total requests on Wednesday Jan 4 between 11:55 and 22:04)
2                Jan 11 2012   211 (total requests on Wednesday Jan 11 between 11:55 and 22:04)
.
.
.

どうすればいいですか?私のクエリは次のとおりです。

WITH v AS (
   SELECT '2012-01-1 11:55:11'::timestamp AS _from -- provide times once
         ,'2012-01-16 22:02:21'::timestamp AS _to
   )
, q AS (
   SELECT c.coordinates_id
        , date_trunc('hour', t.calltime) AS stamp
        , count(*) AS zcount
   FROM   v
   JOIN   mytable t ON  t.calltime BETWEEN v._from AND v._to
                   AND (t.calltime::time >= v._from::time AND
                        t.calltime::time <= v._to::time) AND 
(extract(DOW from t.calltime) = 3)
   JOIN   coordinates c ON (t.lat, t.lon) 
                   BETWEEN (c.bottomrightlat, c.topleftlon)
                       AND (c.topleftlat, c.bottomrightlon)
   GROUP BY c.coordinates_id, date_trunc('hour', t.calltime)
   )
, cal AS (
   SELECT generate_series('2011-2-2 00:00:00'::timestamp
                        , '2012-4-1 05:00:00'::timestamp
                        , '1 hour'::interval) AS stamp
   FROM v
   )
SELECT q.coordinates_id, cal.stamp, COALESCE (q.zcount, 0) AS zcount
FROM v, cal
LEFT JOIN q USING (stamp)
WHERE (extract(hour from cal.stamp) >= extract(hour from v._from) AND
       extract(hour from cal.stamp) <= extract(hour from v._to)) AND 
(extract(DOW from cal.stamp) = 3)
       AND cal.stamp >= v._from AND cal.stamp <= v._to
GROUP BY q.coordinates_id, cal.stamp, q.zcount
ORDER BY q.coordinates_id ASC, stamp ASC;

そして、それがもたらすサンプル結果は次のようになります。

coordinates_id  | stamp                | zcount
1                 2012-01-04 16:00:00    1
1                 2012-01-04 19:00:00    1
1                 2012-01-11 14:00:00    1
1                 2012-01-11 17:00:00    1
1                 2012-01-11 19:00:00    1
2                 2012-01-04 16:00:00    1

ですから、上で述べたように、私はこれを次のように見たいと思います

coordinates_id  | stamp      | zcount
1                2012-01-04    2
1                2012-01-11    3
2                2012-01-04    1
4

1 に答える 1

1

ファイナルSELECTを次のように変更します。

SELECT q.coordinates_id, cal.stamp::date, sum(q.zcount) AS zcount
FROM   v, cal
LEFT   JOIN q USING (stamp)
WHERE  extract(hour from cal.stamp) BETWEEN extract(hour from v._from)
                                        AND extract(hour from v._to)
AND    extract(DOW from cal.stamp) = 3 
AND    cal.stamp >= v._from
AND    cal.stamp <= v._to
GROUP  BY 1,2
ORDER  BY 1,2;

これまでにキャストcal.stampする重要な部分:cal.stamp::date
それ、そしてsum(q.zcount)

于 2012-10-04T23:26:20.817 に答える