取出重复记录的第一条

简介: 这几天在查询购买记录,其中一个需求就是查出来客户首次购买的产品时间和产品名称。说白了,就是在一段时间内,去取出来用户的第一次购买记录,再清楚一些就是在一堆重复的记录中取出第一条购买记录。 这个问题捉只让我困扰了一段时间,自己最存储过程还是不能驾轻就熟,所以还是得按照传统的方法来进行查询了。

这几天在查询购买记录,其中一个需求就是查出来客户首次购买的产品时间和产品名称。说白了,就是在一段时间内,去取出来用户的第一次购买记录,再清楚一些就是在一堆重复的记录中取出第一条购买记录。

这个问题捉只让我困扰了一段时间,自己最存储过程还是不能驾轻就熟,所以还是得按照传统的方法来进行查询了。

要查询的记录如下:

而我们要取出来的记录如下:

事实上,这样的记录如果取出来第一条记录还是比较好取的,因为这里面有购买时间,我们可以根据购买时间,来取出首次购买的记录。同一个用户,购买的时间最早的,就是首次购买产品。

mysql> select account,itemid,buytime from testdup
    -> where buytime in (select min(buytime)
    -> from testdup group by account);

得到的结果如下

+-------------+----------+---------------------+
| account     | itemid   | buytime                    |
+-------------+----------+---------------------+
| zoinzone         | 2686977  | 2011-06-25 18:15:26 |
| llCoKell          | 65599    | 2011-06-14 00:44:36 |
| eventcso010   | 3735553  | 2011-06-23 15:34:33 |
| eventcso004   | 18939907 | 2011-06-24 18:33:35 |
+-------------+----------+---------------------+
4 rows in set (0.00 sec)

此外,还有的情况是,没有这样一个时间的标记项,让我们取出记录中每个重复记录的第一条,我们可以新建一列ID,自动累加,如下:

mysql> select * from testdup;
+----+-------------+----------+---------------------+
| id | account     | itemid   | buytime             |
+----+-------------+----------+---------------------+
|  1 | zoinzone    | 655361   | 2011-06-25 18:16:14 |
|  2 | zoinzone    | 2686977  | 2011-06-25 18:15:26 |
|  3 | llCoKell    | 6691703  | 2011-06-16 19:30:48 |
|  4 | llCoKell    | 65599    | 2011-06-14 00:44:36 |
|  5 | eventcso010 | 3735553  | 2011-06-23 15:34:33 |
|  6 | eventcso010 | 3735553  | 2011-06-26 17:24:25 |
|  7 | eventcso004 | 18939907 | 2011-06-24 18:33:35 |
+----+-------------+----------+---------------------+
7 rows in set (0.02 sec)

我们可以通过ID来取出我们想要的记录:

mysql> select * from testdup
    -> where id in (select min(id)
    -> from testdup group by account);
+----+-------------+----------+---------------------+
| id | account       | itemid    | buytime             |
+----+-------------+----------+---------------------+
|  1 | zoinzone      | 655361   | 2011-06-25 18:16:14 |
|  3 | llCoKell      | 6691703  | 2011-06-16 19:30:48 |
|  5 | eventcso010    | 3735553  | 2011-06-23 15:34:33 |
|  7 | eventcso004    | 18939907 | 2011-06-24 18:33:35 |
+----+-------------+----------+---------------------+
4 rows in set (0.00 sec)

相关文章
|
5月前
|
SQL 关系型数据库 MySQL
如何在MySQL中获取表中的某个字段为最大值和倒数第二条的整条数据?
如何在MySQL中获取表中的某个字段为最大值和倒数第二条的整条数据?
100 0
|
索引
按顺序遍历表
按顺序遍历表
100 0
|
SQL
sql 分组后按时间降序排列再取出每组的第一条记录
原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记录 ...
3028 0
|
存储 索引 Go
对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗
原文:对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗 本文之外可参考另外一篇文章作为补充:http://www.cnblogs.com/wy123/p/6189100.
877 0
|
应用服务中间件 数据库 索引