0

私のテーブルは次のようなものです。

+---------+---------+------------+-----------------------+---------------------+
| visitId | userId  | locationId | comments              | time                |
+---------+---------+------------+-----------------------+---------------------+
|       1 |    3    |     12     | It's a good day here! | 2012-12-12 11:50:12 |
+---------+---------+------------+-----------------------+---------------------+
|       2 |    3    |     23     | very beautiful        | 2012-12-12 12:50:12 |
+---------+---------+------------+-----------------------+---------------------+
|       3 |    3    |     52     | nice                  | 2012-12-12 13:50:12 |
+---------+---------+------------+-----------------------+---------------------+

訪問者の軌跡と訪問した場所に関するコメントを記録します。

特定の場所(たとえばid = 3227)を0:00から23:59までの間に、ある間隔(30分)に訪問した訪問者の数を数えたい

私はこれをしようとしていました:

SELECT COUNT(*) FROM visits 
GROUP BY HOUR(time), SIGN( MINUTE(time) - 30 )// if they are in the same interval this will yield the same result
WHERE locationId=3227

問題は、ある間隔に該当するレコードがない場合、カウント0のその間隔を返さないことです。たとえば、02:00から03:00までその場所を訪問する訪問者がいない場合、これは私に02:00-02:29と02:30-2:59の間隔。

正確なサイズが48(30分ごとに1つ)の結果が必要ですが、どうすればよいですか?

4

1 に答える 1

2

必要な48行のテーブルを作成し、左外部結合を使用する必要があります。

select n.hr, n.hr, coalesce(v.cnt, 0) as cnt
from (select 0 as hr, -1 as sign union all
      select 0, 1 union all
      select 1, -1 union all
      select 1, 1 union all
      . . .
      select 23, -1 union all
      select 23, 1 union all
     ) left outer join
     (SELECT HOUR(time) as hr, SIGN( MINUTE(time) - 30 ) as sign, COUNT(*) as cnt
      FROM visits 
      WHERE locationId=3227
      GROUP BY HOUR(time), SIGN( MINUTE(time) - 30 )
     ) v
     on n.hr = v.hr and n.sign = v.sign
order by n.hr, n.hr
于 2013-03-27T01:38:47.300 に答える