私は従業員のためのタイムクロッキングアプリケーションを作成する必要があります。すべての従業員は、到着時にスキャンされて建物から出る航空券で識別されます。残念ながら、彼らが法律のために到着または離れるかどうかはわかりません(彼らは地下で働いています)。従業員の計時のための保守テーブル
私は何とか2行を1つにまとめて作業時間を得ることを考えています。この方法を使用している唯一の問題は、チケットが到着時または出発時に2回スキャンされた場合に表示されます。
どのようにこの問題を解決しますか?
私は従業員のためのタイムクロッキングアプリケーションを作成する必要があります。すべての従業員は、到着時にスキャンされて建物から出る航空券で識別されます。残念ながら、彼らが法律のために到着または離れるかどうかはわかりません(彼らは地下で働いています)。従業員の計時のための保守テーブル
私は何とか2行を1つにまとめて作業時間を得ることを考えています。この方法を使用している唯一の問題は、チケットが到着時または出発時に2回スキャンされた場合に表示されます。
どのようにこの問題を解決しますか?
私は、このようなタスクを実装した場合、私はクリーンアップのテクニックを使用します。
すべての疑わしい行を削除して(またはuseless
とマークして)、最近のデータを確認しています(昨日のことを考えてみましょう)。その後、私は1つとして「到着」と行を「残して」読むために簡単なJOIN
を使用することができます。
SELECT *
FROM TicketUsages arriving
JOIN TicketUsages leaving
ON arriving.ticket_id = leaving.ticket_id
AND arriving.created_at < leaving.created_at
WHERE from_unixtime(arriving.created_at, '%Y-%m-%d') = '2016-09-14'
/** Optional: AND NOT arriving.useless AND NOT leaving.useless **/
クリーンアップ手順が異なるだけで、カウントしてチケットを見つけることがあり、その後2.これはあなたの無効を表示しますチケット:
SELECT ticket_id, count(*)
FROM TicketUsages
WHERE from_unixtime(arriving.created_at, '%Y-%m-%d') = '2016-09-14'
GROUP BY ticket_id
HAVING count(*) != 2
次に、行の処理方法を決定するだけです。 2つ以上ある場合は、おそらく最初と最後を保持するだけです。しかし、1行しか返されなければ何をするかはあなた次第です。
ありがとうございました!残念ながら私は最後の1時間の要件を持っている、彼らは同じチケットで建物を複数回出入りすることができます。 – Vlad
どのようにしてこのチケットを取得しますか? 1営業日に?彼らは別の日に出発してから入社することができますか? 'created_at'は到着時間であり、' updated_at'は離脱時間であるはずですか? – Marco
二重スキャンを処理するには、前回のスキャンから短時間の間にスキャンが無視される「猶予期間」が導入される可能性があります。これをアプリケーション側で実装することも、クエリを実行するときに一定の間隔(1分など)でレコードをロールアップ(グループ化)することもできます。そのことを言っても、このサイトの質問は話題にはならないようです。 – mustaccio
1日に1枚のチケットがあります。はい、そうすることができます。 'created_at'と' updated_at'は同じ値に設定されています(フレームワークによって設定されています)。どのように2つの連続した行をペアにして勤務時間を得ることができますか? – Vlad