2013-08-07 87 views
1

我的問題可能很簡單回答(對不起),但我找不到解決方案。每個編號的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

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

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(只選擇可用的,但它的相同)

+0

位置需要有ID contraint,otherwhise你指望「全部」日期,但TC需要一定的ID組中的位置。 – dognose

+0

和他的表中的位置列在哪裏? –

+0

@PraveenPrasannan我假設他想要在他的桌子上。 '我如何在MySQL中創建位置列,而不僅僅是選擇它。 –

1

您可以使用sessi關於變量,但我很感性;我喜歡慢,老式的方法...

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; 
+0

不錯,這也很好。 – hims056