为不同的用户选择最大和最小日期时间

时间:2019-05-29 09:36:00

标签: mysql

我有一条记录如下

ID(int)      DATA_ORA(timestamp)     BADGE  LETTORE       
   1         2017-04-01 09:30:00       1       1    
   2         2017-04-01 12:30:00       1       2    
   3         2017-04-01 13:30:00       1       1    
   4         2017-04-01 18:30:00       1       2    
   5         2017-04-01 09:30:00       2       1    
   6         2017-04-01 18:30:00       2       2    
   7         2017-04-02 09:30:00       1       1    
   8         2017-04-02 18:30:00       1       2
   9         2017-04-03 09:30:00       3       1    
   10        2017-04-03 12:30:00       3       2    
   11        2017-04-03 13:30:00       3       1    
   12        2017-04-03 18:30:00       3       2 

我想获取每个用户(徽章)的首次访问时间和最后一次每日注销时间(每天)。

我该怎么做?

我想要的记录如下

ID(int)      DATA_ORA(timestamp)     BADGE  LETTORE       
   1         2017-04-01 09:30:00       1       1        
   4         2017-04-01 18:30:00       1       2    
   5         2017-04-01 09:30:00       2       1    
   6         2017-04-01 18:30:00       2       2    
   7         2017-04-02 09:30:00       1       1    
   8         2017-04-02 18:30:00       1       2
   9         2017-04-03 09:30:00       3       1      
   12        2017-04-03 18:30:00       3       2 

有可能这样做吗?谢谢。

注意:ID会自动递增,LETTORE 1是输入,LETTORE 2是退出。

5 个答案:

答案 0 :(得分:0)

您可以对徽章1和徽章2使用带有subqiery的联接

select t1.badge, min_dat, nax_date
from  (
  select  badge, min_(data_ora) min_data
  from my_table
  where lettore  = 1 
  group by badge 
) t1 
INNER JOIN  (
 select  badge, max_(data_ora) max_data
  from my_table
  where lettore  = 2
  group by badge 
) t2  ON t1.badge = t2.badge 

答案 1 :(得分:0)

在下面尝试使用相关子查询并全部合并

select * from tablename a
where DATA_ORA in (select min(DATA_ORA) from tablename b where a.badge=b.badge)
union 
select * from tablename a
where DATA_ORA in (select max(DATA_ORA) from tablename b where a.badge=b.badge)

答案 2 :(得分:0)

您可以按日期,徽章和lettore进行分组,例如:

array([[4, 1, 2],
       [0, 3, 6]])

答案 3 :(得分:0)

我喜欢@ fa06答案,但他错过了,您希望每天获取数据。 所以试试这个:

select * from t1 a
where DATA_ORA in (select min(DATA_ORA) from t1 b where a.badge=b.badge GROUP BY DATE_FORMAT(DATA_ORA, '%Y%m%d'))
union
select * from t1 a
where DATA_ORA in (select max(DATA_ORA) from t1 b where a.badge=b.badge GROUP BY DATE_FORMAT(DATA_ORA, '%Y%m%d'));

答案 4 :(得分:0)

这是表和查询的执行版本,它以您所需的顺序在DB-fiddle上提供输出。 尝试以下查询:

select * from EntryExitLogs where id in
    (select id from EntryExitLogs where (badge,data_ora)= any 
    (select badge,min(data_ora)from EntryExitLogs group by date(data_ora),badge))
    union
    (select * from EntryExitLogs where id in
    (select id from EntryExitLogs where (badge,data_ora)= any 
    (select badge,max(data_ora)from EntryExitLogs group by date(data_ora),badge)))
    order by id;

我认为最好使用ID列来选择行,因为timestamp列包含重复项。