我的问题可能很容易回答(对不起),但我找不到解决方案。
我有一张这样的表:
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中创建位置列?
非常感谢!
答案 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;
您还可以实现用户定义的变量:
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
答案 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(仅选择可用,但它是相同的)