只得到最大的约会:

这些是员工的报到和退房记录,有时他们会在系统中连续做两次或更多的记录。在这个样本中,连续有两次退房。假设这些行总是有序的,在结帐的情况下,我希望有最大的日期,而在签出的情况下,最小的日期。
在这种情况下,我希望这样做:
较小的日期不包括在内:

演示
发布于 2018-09-03 18:57:26
试试这个,在这个大的CASE语句中,如果checkin从null切换到not null,然后反过来,我将逐个递增列。那么,按照本专栏分别对max和min of checkout和checkin进行分组就足够了:
select @checkinLag := null, @rn := 0;
select max(id),
functionario,
loja,
min(checkin),
max(checkout)
from (
select case when (checkinLag is null and checkin is not null) or
(checkinLag is not null and checkin is null)
then @rn := @rn + 1 else @rn end rn,
checkin,
checkout,
loja,
id,
functionario
from (
select @checkinLag checkinLag,
@checkinLag := checkin,
checkin,
checkout,
loja,
id,
functionario
from dummyTable
order by coalesce(checkin, checkout)
) a
) a group by functionario, loja, rn正如Gordon所指出的,我使用了子查询来保证计算表达式的顺序(分配和使用@checkinLag)。
演示
发布于 2018-09-03 18:45:02
我的解决方案:
Select
*
from dummyTable base
where (base.checkout is null or not exists (
select
1
from dummyTable co
where co.checkout between base.checkout and DATE_ADD(base.checkout, INTERVAL 5 SECOND)
and base.id <> co.id
and base.functionario = co.functionario
and base.loja = co.loja
)) and (base.checkin is null or not exists (
select
1
from dummyTable ci
where ci.checkin between DATE_SUB(base.checkin, INTERVAL 5 SECOND) and base.checkin
and base.id <> ci.id
and base.functionario = ci.functionario
and base.loja = ci.loja
));您可以测试查询这里。没有必要对行进行排序。我选择5秒作为应该忽略签入/退出的间隔。
https://stackoverflow.com/questions/52154305
复制相似问题