从规范化表中选择数据

时间:2020-09-25 23:39:56

标签: mysql sql datetime greatest-n-per-group window-functions

我一直想写这个查询,我想今晚我的大脑有点炸了。我有一个存储该表的表格,无论何时有人执行某项操作(锁定,计时,午餐,从午餐返回),我都需要返回上次操作的人的所有主要ID的列表不是clock_out-但问题是它需要一个快速查询。

表结构:

ID | person_id | status | datetime | shift_type

ID =该表的主键

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

状态=时钟输入,午餐开始,午餐结束,中断开始,中断结束,时钟结束

datetime =添加记录的时间

shift_type =不重要

我之前执行此查询的方式是找到在特定时间段内仍在排队的人,但是我需要在任何时间定位此查询。我正在尝试的查询正在获取成千上万的记录,并使其变得太慢。

2 个答案:

答案 0 :(得分:1)

我需要返回上次操作不是clock_out的人员的所有主要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'

答案 1 :(得分:0)

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

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

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

相关问题