MySQL 对每个 id 的日期进行编号

标签 mysql

<分区>

我的问题可能很容易回答(抱歉),但我找不到解决方案。

我有一个这样的表:

id / date  
1 / 2013-5-5 13:44:12  
1 / 2013-5-5 15:34:19  
1 / 2013-6-5 05:14:07  
2 / 2012-3-4 06:33:33  
2 / 2013-5-5 12:23:10  
3 / 2012-5-7 11:43:17   

我想要的是:

id / date / position  
1 / 2013-5-5 13:44:12 / 1    
1 / 2013-5-5 15:34:19 / 2  
1 / 2013-6-5 05:14:07 / 3   
2 / 2012-3-4 06:33:33 / 1   
2 / 2013-5-5 12:23:10 / 2   
3 / 2012-5-7 11:43:17 / 1  

因此,每个 id 最早的日期应该排在第 1 位,第二早的排在第 2 位,依此类推。如何在 MySQL 中创建位置列?

非常感谢!

最佳答案

不幸的是,MySQL 没有为数据分配行号的窗口函数。但是有几种方法可以获得结果,您可以使用类似于以下的子查询返回此位置编号:

select t.id,
  t.date,
  (select count(*)
   from yourtable r
   where r.id = t.id
     and r.date <= t.date) position
from yourtable t
order by t.id, t.date;

参见 SQL Fiddle with Demo .

您还可以实现用户定义的变量:

select id, date, position
from
(
  select t.id,
    t.date,
    @row:=case 
            when @prev=t.id and @pd<= t.date
            then @row else 0 end +1 position,
    @prev:=t.id,
    @pd:=t.date
  from yourtable t
  cross join (select @row:=0, @prev:=0, @pd:=null) c
  order by t.id, t.date
)d

参见 SQL Fiddle with Demo

关于MySQL 对每个 id 的日期进行编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18102750/

相关文章:

php - 在 Yii 中设置默认时区

c# - 如何在 asp.net mvc 中修复 404 'Resource cannot be found'

mysql - 如何交换两个表都已创建的表名?

mysql - 我有一个博客表。希望算作明智的地位

mysql - 转换Mysql中的查询

MySQL插入硬编码值数组

PHP 将 MYSQL 中的 jpeg 回显到 HTML 页面中

optimization - 我如何优化这个涉及两个左连接的 MySQL 查询?

python - Flask-peewee 到 Flask-sqlalchemy - 操作数应包含 1 列

mysql - docker 撰写 spring boot 日志