のは、テーブルの内容は次のようになりましょうが、以下:
CREATE TABLE eqp (eno int, action_type varchar(20), action_date timestamp);
INSERT INTO eqp VALUES(124, 'checkout', '2017-02-03 09:00:00');
INSERT INTO eqp VALUES(123, 'checkout', '2017-02-03 09:05:27');
INSERT INTO eqp VALUES(124, 'checkin', '2017-02-03 10:00:00');
INSERT INTO eqp VALUES(123, 'checkin', '2017-02-03 10:32:46');
INSERT INTO eqp VALUES(123, 'checkout', '2017-02-03 11:15:27');
INSERT INTO eqp VALUES(123, 'checkin', '2017-02-03 11:30:55');
INSERT INTO eqp VALUES(123, 'checkout', '2017-02-04 09:00:00');
INSERT INTO eqp VALUES(123, 'checkin', '2017-02-04 10:00:00');
INSERT INTO eqp VALUES(123, 'checkout', '2017-02-04 15:00:00');
INSERT INTO eqp VALUES(123, 'checkin', '2017-02-04 17:00:00');
INSERT INTO eqp VALUES(123, 'checkout', '2017-02-04 18:30:00');
INSERT INTO eqp VALUES(123, 'checkin', '2017-02-04 19:00:00');
をので、以下を想定して:
checkout
は常に
- アクションの両方が可能になる機器の
checkin
を先行します同じ日に完了し、そして
- (暗黙の仮定)この所望の動作が実行される前にチェックアウトされているすべての機器が(テーブル内のレコードにチェックを持つことになります)
我々はすべてのcheckout
イベントを取得するために、単一のクエリを書くことができますが、時間によって第1の機器によって、その後ソート、順番に彼らが発生し、フェッチされたすべてのレコードへrank
割り当てること:
SELECT @checkoutrank := @checkoutrank + 1 AS rank, eno, action_type, action_date
FROM eqp, (SELECT @checkoutrank := 0) r
WHERE action_type='checkout'
ORDER BY eno ASC, action_date ASC
これが与える:
は
rank | eno | action_type | action_date
----------------------------------------------------------
1 | 123 | checkout | 2017-02-03 09:05:27
2 | 123 | checkout | 2017-02-03 11:15:27
3 | 123 | checkout | 2017-02-04 09:00:00
4 | 123 | checkout | 2017-02-04 15:00:00
5 | 123 | checkout | 2017-02-04 18:30:00
6 | 124 | checkout | 2017-02-03 09:00:00
類似したクエリには、THできますまたcheckin
のために書かれている。同等の順にcheckout
とcheckin
を対応する - -
我々は、2つのテーブルを持たなければならないと、彼らが発生した順序で、これにより、機器の個々のセッションの開始時刻と終了私たちを与えます。私たちに出力を与える
SELECT checkin.eno, DATE(checkin.action_date) AS session_date,
COUNT(*) AS sessions,
SUM(TIMESTAMPDIFF(SECOND, checkout.action_date, checkin.action_date))
AS sesssion_duration
FROM
(
SELECT @checkoutrank := @checkoutrank + 1 AS rank, eno, action_type, action_date
FROM eqp, (SELECT @checkoutrank := 0) r
WHERE action_type='checkout'
ORDER BY eno ASC, action_date ASC
) checkout
INNER JOIN
(
SELECT @checkinrank := @checkinrank + 1 AS rank, eno, action_type, action_date
FROM eqp, (SELECT @checkinrank := 0) r
WHERE action_type='checkin'
ORDER BY eno ASC, action_date ASC
) checkin
ON checkout.rank = checkin.rank
AND checkout.eno = checkin.eno
GROUP BY checkin.eno, DATE(checkin.action_date)
:これら二つの対応のテーブルは今、単に私たちはそれぞれcheckout
とcheckin
間の時間差までsessions
の数だけでなく、SUM
を計算することができrank
とeno
(機器番号)を介して結合することができ
eno | session_date | sessions | session_duration
--------------------------------------------------------------
123 | 2017-02-03 | 2 | 6167
123 | 2017-02-04 | 3 | 12600
124 | 2017-02-03 | 1 | 3600
上記session_duration
は、簡略化のためだけでなく、精度をSECOND
Sで計算されるように。
Demo link。
チェックアウトとチェックインは常に交互に行われると思いますか? – McNets
はい - チェックインは、チェックインの日付の前に、重複はありません。 – andrewb
機器は、例えば23:55:00でチェックアウトされ、翌日、02:00:00にチェックイン可能ですか'?セッションはどの日に帰されるのですか? –