我的数据如下:
id start_time sub_id
6 2015-01-03 19:00:00 3
5 2015-01-03 18:00:00 3
4 2015-01-03 17:00:00 3
3 2015-01-02 15:08:00 2
2 2015-01-01 14:08:00 2
1 2015-01-01 22:00:00 1
我想使用查询来转换数据,如下所示:
id start_time sub_id stage
6 2015-01-03 19:00:00 3 3
5 2015-01-03 18:00:00 3 2
4 2015-01-03 17:00:00 3 1
3 2015-01-02 15:08:00 2 2
2 2015-01-01 14:08:00 2 1
1 2015-01-01 22:00:00 1 1
无法更改表本身,只需查询它。
我正在尝试创建一个额外的列" stage"在我的查询结果中,它计算表中sub_id的外观,从每个新的sub_id开始。
我已经看到了一些使用游标或其他方法的建议,但这些是计算整个表的行数,而不是在行的值从之前的行更改时重新开始计数。 / p>
我应该怎么做呢?它是否可以在原生MySQL中使用?
答案 0 :(得分:1)
您可以使用变量执行此操作:
select d.*,
(@rn := if(@s = sub_id, @rn + 1,
if(@s := sub_id, 1, 1)
)
) as stage
from data d cross join
(select @s := 0, @rn := 0) params
order by sub_id, id desc;
分配变量并仅在单个表达式中使用它们非常重要,这就是此版本具有嵌套if()
的原因。 MySQL文档非常清楚,您应该避免在一个表达式中分配变量并在另一个表达式中使用它。
答案 1 :(得分:0)
SET @row_number:=0;
SET @sub_id:= 0;
SELECT id,
start_time,
CASE
WHEN @sub_id = sub_id THEN @row_number := @row_number + 1
ELSE @row_number := 1
end AS ROWNO,
CASE
WHEN @sub_id <> sub_id THEN @sub_id := sub_id
ELSE @sub_id
end
FROM dates
ORDER BY sub_id DESC,
rowno DESC