根据每个名称的最旧时间戳选择行

时间:2017-08-30 18:23:06

标签: mysql

我正在尝试根据每个名称的最旧时间戳来选择行。我提到了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 |
+------+-------------+---------------------+

我的预期结果将是这样的

对于&#39; tom&#39;

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

对于&#39; bob&#39; ,因为有两个记录具有相同的时间戳,我可以选择任何一个而不管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 |

1 个答案:

答案 0 :(得分:1)

您可以对min(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 

如果你有boigu的ambiguos行min(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