3

以下について助けが必要です

以下のようにデータを格納するテーブル「データ」があります

+------------+----------+-----------
| regdate    | regtime  | items              
+------------+----------+-----------
| 2013-03-02 | 09:12:03 | item1   
| 2013-03-02 | 10:12:05 | item1          
| 2013-03-02 | 15:12:07 | item2    
| 2013-03-02 | 20:12:09 | item3       
| 2013-03-02 | 21:12:11 | item4    
| 2013-03-02 | 22:12:14 | item3 

10 品目の場合、1 日の09:00 から 23:00 までの異なる時間にテーブルに移動できます。

そして、私は以下のような別のテーブル「ItemsPerInterval」を持っています

+------------+-------------+-------------+-------------+-------------+
| regdate    | reginterval | item1       | item2       | item3       |
+------------+-------------+-------------+-------------+-------------+
| 2013-03-01 | 09:00:00    | 0           | 0           | 0           |
+------------+-------------+-------------+-------------+-------------+

09:00 、 09:30 、 10:00 、 10:30 ... 23:00 まで、間隔が30 分単位で増加する場合など


私がしたいのは、テーブルItemsPerIntervalにデータを挿入して、テーブル「データ」 ( item1、item2 、item3 、... item10 ) のアイテムの繰り返しカウントを含め、間隔ごとにそれらを保存することです ( 09:00 :00, 09:30:00, 10:00:00, 10:30:00, .... 23:00:00 )のように、各間隔 (たとえば、09:00:00)に繰り返しカウントが含まれるようにします。 09:00:00 から09:29:59 までのデータテーブルに登録されたすべてのアイテムと、 23:00:00 までの残りの間隔に対して 1 つのアイテム

編集 **1

したがって、最終的には、以下のすべての間隔を ItemsPerInterval テーブルに登録し、間隔時間ウィンドウで報告された 10 項目の各項目のカウントを保持する必要があります。

09:00:00
09:30:00
10:00:00
10:30:00
11:00:00
11:30:00
12:00:00
12:30:00
13:00:00
13:30:00
and so on .....
.
.
.
22:00:00
22:30:00
23:00:00

/編集 **1

ルーチン/手順についていくつか読みましたが、違いがわかりませんし、それを使用して上記を実装する方法もわかりません。

私はソフトウェアを使用しています:MySQLソフトウェアバージョン:PHPで5.5.24。

あなたの支援に感謝

ありがとうございました

4

1 に答える 1

5

次のクエリを使用できます。

SELECT
  regdate,
  SEC_TO_TIME(TRUNCATE(TIME_TO_SEC(regtime)/(60*30),0)*(60*30)) reginterval,
  COUNT(CASE WHEN items='item1' THEN 1 END) item1,
  COUNT(CASE WHEN items='item2' THEN 1 END) item2,
  COUNT(CASE WHEN items='item3' THEN 1 END) item3,
  COUNT(CASE WHEN items='item4' THEN 1 END) item4
FROM Data
GROUP BY
  regdate,
  reginterval

結果の行を新しいテーブルに挿入する必要がある場合は、最初に次の行を追加するだけです。

INSERT INTO ItemsPerInterval (regdate, reginterval, item1, item2, item3, item4)
SELECT ...

編集

値がなくてもすべての間隔を表示したい場合は、Intervals必要なすべての間隔を含むテーブルを作成するのが最善だと思います。

CREATE TABLE Intervals (
  reginterval time
);

INSERT INTO Intervals VALUES
('09:00:00'),
('09:30:00'),
('10:00:00'),
...

このクエリは、テーブルに存在するすべての日付と組み合わせて、すべての間隔を返します。

SELECT Dates.regdate, Intervals.reginterval
FROM
  (SELECT DISTINCT regdate FROM Data) Dates,
  Intervals

そして、このクエリは必要な行を返します:

SELECT
  di.regdate,
  di.reginterval,
  COUNT(CASE WHEN Data.items='item1' THEN 1 END) item1,
  COUNT(CASE WHEN Data.items='item2' THEN 1 END) item2,
  COUNT(CASE WHEN Data.items='item3' THEN 1 END) item3,
  COUNT(CASE WHEN Data.items='item4' THEN 1 END) item4
FROM (
  SELECT Dates.regdate, Intervals.reginterval
  FROM (SELECT DISTINCT regdate FROM Data) Dates,
       Intervals
  ) di
  LEFT JOIN Data
   ON di.regdate=Data.regdate
      AND di.reginterval=SEC_TO_TIME(TRUNCATE(TIME_TO_SEC(Data.regtime)/(60*30),0)*(60*30))
GROUP BY
  regdate,
  reginterval;

ここでフィドルを参照してください。

これはどのように作動しますか

ここでの考え方regtimeは、時間を含むフィールドである を、TIME_TO_SEC関数を使用して、1 日の始まりからの秒数に変換することです。

TIME_TO_SEC(regtime)

次に、この数値を 30 分の秒数である 60*30 に分割し、整数部分のみを保持します。

TRUNCATE(number_of_seconds/(60*30), 0)

次に、整数部分を 60*30 に乗算して秒数を取得し、60*30 秒 (30 分) で丸めます。

SEC_TO_TIMEを使用して、秒数を時間フィールドに変換します。

于 2013-03-12T22:16:13.157 に答える