2017-08-30 73 views
1

我想根据每个名称最旧的时间戳选择行。我提到这个solution但问题是我的表没有id列。我试图添加一个临时自动增量id列,但不知道如何去做。基本上当时间戳相同时,我想为给定名称选择任何一个可用记录。有人可以帮助我在这里。根据每个名称最旧的时间戳选择行

mysql> select * from tblemployee order by name; 
+------+-------------+---------------------+ 
| name | day_of_week | signin_date   | 
+------+-------------+---------------------+ 
| bob | wednesday | 2017-08-11 08:11:30 | 
| bob | thursday | 2017-06-11 11:21:30 | << same timestamp 
| bob | saturday | 2017-08-28 09:01:30 | 
| bob | wednesday | 2017-08-11 08:11:30 | 
| bob | monday  | 2017-06-11 11:21:30 | << same timestamp 
| tom | wednesday | 2017-08-28 23:01:20 | 
| tom | sunday  | 2017-08-29 09:01:30 | 
+------+-------------+---------------------+ 

我预期的结果会是这样的

对于“嗵”

+------+-------------+---------------------+ 
| name | day_of_week | signin_date   | 
+------+-------------+---------------------+ 
| tom | wednesday | 2017-08-28 23:01:20 | 

为“鲍勃”因为有两个记录有相同的时间戳,我可以挑选任何一个不管day_of_week。

+------+-------------+---------------------+ 
| name | day_of_week | signin_date   | 
+------+-------------+---------------------+ 
| bob | thursday | 2017-06-11 11:21:30 | 

        (or) 

| bob | monday  | 2017-06-11 11:21:30 | 
+0

你想要一个人(bob)或一组人吗?对于1,ORDER BY和LIMIT 1.我从“行”猜测你想要bob和tom,但它并不是100%清楚。 –

+0

我想根据最早的时间戳为每个用户选择一条记录。 – chidori

回答

1

您可以使用的分钟(signin_date)组值联接如:

select distinct a.name, a.day_of_week , a.signin_date   
    from tblemployee a 
    inner join (
    select name, min(signin_date) as min_date 
    from tblemployee 
    group by name 
) t on t.min_date = a.signin_date and a.name = t.name 

,如果你有ambiguos行作为鲍勃分钟(signin_date)我与两个不同的日期,然后你应该得到这一个使用

select a.name, min(a.day_of_week) , a.signin_date   
    from tblemployee a 
    inner join (
    select name, min(signin_date) as min_date 
    from tblemployee 
    group by name 
) t on t.min_date = a.signin_date and a.name = t.name 
    group by a.name,a.signin_date   
+0

对不起,这似乎并不适用于我。列重复,我看到有关鲍勃出现两次的记录。 – chidori

+0

答案更新.. – scaisEdge

+0

谢谢,列名现在看起来不错,但我仍然看到查询返回两个记录的情况下名称'鲍勃'。 – chidori