Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从规范化表中选择数据_Mysql_Sql_Datetime_Greatest N Per Group_Window Functions - Fatal编程技术网

Mysql 从规范化表中选择数据

Mysql 从规范化表中选择数据,mysql,sql,datetime,greatest-n-per-group,window-functions,Mysql,Sql,Datetime,Greatest N Per Group,Window Functions,我一直在努力写这个问题,我想今晚我的大脑有点紧张。我有一个表,当一个人执行打卡、打卡、吃午饭、吃午饭回来的动作时,它存储了这个表,我需要为最后一个动作没有打卡的人返回一个所有主要ID的列表,但问题是它需要有点快的查询 表结构: ID | person_id | status | datetime | shift_type ID=此表的主键 person_id=如果他们的状态不等于clock_out,我要返回的id 状态=打卡进入、午餐开始、午餐结束、休息开始、休息结束、打卡离开 datetim

我一直在努力写这个问题,我想今晚我的大脑有点紧张。我有一个表,当一个人执行打卡、打卡、吃午饭、吃午饭回来的动作时,它存储了这个表,我需要为最后一个动作没有打卡的人返回一个所有主要ID的列表,但问题是它需要有点快的查询

表结构:

ID | person_id | status | datetime | shift_type
ID=此表的主键

person_id=如果他们的状态不等于clock_out,我要返回的id

状态=打卡进入、午餐开始、午餐结束、休息开始、休息结束、打卡离开

datetime=添加记录的时间

移位类型=不重要

我以前执行此查询的方式是查找在特定时间段内仍在上班的人,但是我需要此查询在任何时间点进行定位。我正在尝试的查询占用了成千上万的记录,速度太慢了

我需要返回最后一个操作未打卡的人的所有主要ID的列表

一个选项使用MySQL 8.0中提供的窗口函数:

select id
from (
    select t.*, row_number() over(partition by person_id order by datetime desc) rn
    from mytable t
) t
where rn = 1 and status <> 'clock_out'
在早期版本中,一个选项使用相关子查询:

select id
from mytable 
where 
    datetime = (select max(t1.datetime) from mytable t1 where t1.personid = t.person_id)
    and status <> 'clock_out'

在进一步研究之后,这就是我的解决方案-

SELECT * FROM (
   SELECT `status`,`person_id` FROM `timeclock` ORDER BY `datetime` DESC
) AS tmp_table GROUP BY `person_id`

这是因为它将所有相同的个人ID分组在一起,然后按日期时间排序,并选择最新的。

我不确定托管服务器是否在windows上运行,但对于此服务器版本,SELECT在此位置无效,应为、LOCK、TABLE、VALUES,@JayMason:与Windows操作系统无关。但是,它们可以在MySQ中找到。仅8.0;您正在运行哪个版本?MySQL Server 8.0、MySQL Workbench 8.0CE@JayMason:好的,这样就行了。请完全按照提供的方式运行查询。