每个id的MySQL编号日期

时间:2013-08-07 11:56:25

标签: 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中创建位置列?

非常感谢!

3 个答案:

答案 0 :(得分:3)

不幸的是,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

答案 1 :(得分:1)

你可以使用会话变量,但我是多愁善感的;我喜欢这种较慢,老式的方法......

 SELECT x.*
      , COUNT(*) rank 
   FROM my_table x 
   JOIN my_table y 
     ON y.id = x.id 
    AND y.date <= x.date 
  GROUP 
     BY id,date;

答案 2 :(得分:0)

计算每个日期下方的行数:

UPDATE
    `table`
SET
    position = 
    (
        SELECT
            COUNT(1) + 1
        FROM
            `table` t
        WHERE
            t.`date` < `table`.`date`
            AND t.id = table.id
        ORDER BY
            `date`
    )

SQL Fiddle(仅选择可用,但它是相同的)