我有一個table
(id
,employee_id
,device_id
,logged_time
)[簡化]該記錄來自生物測定設備的員工出勤。 我生成報告,顯示每個員工按日期分配的首次和最後一次出廠時間。對應於最大/另一列的無分鐘選擇列(多個)連接
目前,我能夠按日期取得每位員工的首次進入時間,但我也需要取得每位員工的第一次進入和最後一次進入device_id
。條目不按記錄時間的順序排列。
我不希望(也可能不能)使用連接,因爲在其中一個報告中列動態生成,並可能導致數千個連接。此外,這些是子查詢,並加入到其他查詢以獲得更多詳細信息。
表中的樣品的設置和查詢是在http://sqlfiddle.com/#!9/3bc755/4
第一個只是顯示列出了每個員工
select
attendance_logs.employee_id,
DATE(attendance_logs.logged_time) as date,
TIME(MIN(attendance_logs.logged_time)) as entry_time,
TIME(MAX(attendance_logs.logged_time)) as exit_time
from attendance_logs
group by date, attendance_logs.employee_id
的日期的入口和出口時間的第二個構建了出勤圖表給定日期範圍
select
`attendance_logs`.`employee_id`,
DATE(MIN(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-18' THEN `attendance_logs`.`logged_time` END)) as date_2017_09_18,
MIN(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-18' THEN `attendance_logs`.`logged_time` END) as entry_2017_09_18,
MAX(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-18' THEN `attendance_logs`.`logged_time` END) as exit_2017_09_18,
DATE(MIN(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-19' THEN `attendance_logs`.`logged_time` END)) as date_2017_09_19,
MIN(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-19' THEN `attendance_logs`.`logged_time` END) as entry_2017_09_19,
MAX(case when DATE(`attendance_logs`.`logged_time`) = '2017-09-19' THEN `attendance_logs`.`logged_time` END) as exit_2017_09_19
/*
* dynamically generated columns for dates in date range
*/
from `attendance_logs`
where `attendance_logs`.`logged_time` >= '2017-09-18 00:00:00' and `attendance_logs`.`logged_time` <= '2017-09-19 23:59:59'
group by `attendance_logs`.`employee_id`;
嘗試:
類似於每個日期的最大和最小logged_time
使用case
,試圖選擇device_id
其中logged_time
是最大/最小值。
```MIN(case
when
`attendance_logs.logged_time` = MIN(
case when DATE(`attendance_logs`.`logged_time`)
= '2017-09-18' THEN `attendance_logs`.`logged_time` END
)
then `attendance_logs`.`device_id` end) as entry_device_2017_09_18 ```
這導致invalid use of group by
特定於日期的動態列的任何原因?看起來非常「不相關」...... –
@RomanSusi,基本上,查詢的結果是「生成的報告」(有一些變化),這也用於多個功能相似但功能不同的地方。 在整個月或幾個月內爲每位員工提取每日出勤數據,並在應用程序端處理此圖表(包括有關班次,日程安排等的額外計算)可能會變得複雜並且會隨時間和內存出現問題,因爲數據巨大。在數據庫上這樣做似乎很好。 建議更好的方式將不勝感激。 – Shuvo