1

クラスに参加する学生の到着時刻と出発時刻を含むテーブルがあります。次のようなデータが与えられた場合:

CREATE TABLE `attendance` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `class_id` int(11) DEFAULT NULL,
  `student_id` int(11) NOT NULL DEFAULT '0',
  `arrival` datetime DEFAULT NULL,
  `departure` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `attendance` (`id`, `class_id`, `student_id`, `arrival`, `departure`)
VALUES
(1,1,1,'2013-01-01 16:00:00','2013-01-01 17:00:00'),
(2,1,2,'2013-01-01 16:00:00','2013-01-01 18:00:00'),
(3,1,3,'2013-01-01 17:00:00','2013-01-01 19:00:00'),
(4,1,4,'2013-01-01 17:00:00','2013-01-01 19:00:00'),
(5,1,5,'2013-01-01 17:30:00','2013-01-01 18:30:00');

時間の内訳を分単位で取得しようとしており、その期間に何人の学生が出席していますか。上記のデータから次のような結果が得られます。

Time  Students
60    2        (the first hour from 16:00 to 17:00 has students 1 & 2)
30    3        (the next 30 minutes from 17:00 to 17:30 has students 2, 3 & 4)
30    4        (etc...)
30    3
30    2

私がこれまでに持っている選択ステートメントは、答えに向けてある程度進んでいますが、うまく機能させることはできません:

SELECT a.id, a.arrival, b.id, LEAST(a.departure,b.departure) AS departure,
TIMEDIFF((LEAST(a.departure,b.departure)),(a.arrival)) AS subtime
FROM attendance a
JOIN attendance b ON (a.id <> b.id and a.class_id=b.class_id 
  and a.arrival >= b.arrival and a.arrival < b.departure) 
WHERE a.class_id=1
ORDER BY a.arrival, departure, b.id; 

これを正しく行うのを手伝ってくれる人に前もって感謝します。

4

1 に答える 1

0

を使用correlated sub-queriesすると、仮想テーブルを作成できます ( と同じではありませんが、temporary table考え方は同じです)。これらの仮想テーブルに対して、実際に存在するかのようにクエリを実行できます。

select clocks.clock, count( att.student_id ) as numStudents
from
(
        ( select arrival as clock from attendance )
        union distinct
        ( select departure as clock from attendance )
)
as clocks
        left outer join attendance att on att.arrival <= clocks.clock and clocks.clock < att.departure
group by clocks.clock
order by 1,2
;

ほとんどあなたが探しているもの。経過時間でグループ化するのではなく、実際の「イベント」のタイムスタンプ (到着と出発) を使用して、有用なレポートを提供します。

clock               numStudents 
------------------- ----------- 
2013-01-01 16:00:00 2           
2013-01-01 17:00:00 3           
2013-01-01 17:30:00 4           
2013-01-01 18:00:00 3           
2013-01-01 18:30:00 2           
2013-01-01 19:00:00 0  

レポートには、各イベント時間にまだ「ここ」にいる学生の数が表示されます。

うまくいけば、これはあなたにとって役に立ちます。

于 2013-03-28T23:45:19.207 に答える