如何删除下面absen
表格中的重复数据?
- 字段表absen(日期,时间,id_user)
- 字段表员工(姓名,部门,地址,id_user)
醇>
我尝试了查询:
select absen.date,min(absen.time),max(absen.time),absen.id_user,employee.name
from absen,employee
where absen.id_user = employee.id_user
group by absen.tanggal having employee.id_user = '00600320' and absen.tanggal between '2015/01/01' and '2015/01/31'
order by absen.tanggal asc
我想删除此查询中未包含的所有数据,因为员工每天有多行。
示例:
2015/01/01 08:00:00 00600320
2015/01/01 08:00:08 00600320
2015/01/01 08:00:15 00600320
2015/01/01 17:10:00 00600320
2015/01/01 17:00:10 00600320
2015/01/01 17:00:12 00600320
我只想从表absen中取出min和max并删除min和max之间的所有内容。
注意:我想要删除表。
答案 0 :(得分:1)
分两步完成:
1 。使用相关的min
和max
日期获取您的数据:
您可以使用CONCAT
功能来连接日期和时间。
select
t.id_user,
min(CONCAT(t.date,' ',t.time)) mindate,
max(CONCAT(t.date,' ',t.time)) maxdate
from absen t
join employee on t.id_user = employee.id_user
group by t.id_user ;
2 。删除与上述想要的结果集无关或属于的数据。
创建另一个table
(或temporary table
),将无重复数据(max
和mins
插入其中,然后从原始表中删除数据不是在新创建的表中使用row_subquery
并最终删除新创建的表,我创建了另一个表,因为不能同时使用delete并在同一个表上选择:
create table tbl(id_user int,
mindate datetime,
maxdate datetime);
insert into tbl
select
t.id_user,
min(CONCAT(t.date,' ',t.time)) mindate,
max(CONCAT(t.date,' ',t.time)) maxdate
from absen t
join employee on t.id_user = employee.id_user
group by t.id_user ;
delete from absen
where
row(id_user,
CONCAT(date,' ',time)) not in
(select id_user,mindate from tbl
union
select id_user,maxdate from tbl);
drop table tbl;
以下是我所做的THE DEMO。