我有一张这样的表:
[C1] [C2] [C3] [C4]
a1 b1 c1 val1 -- group 1
a1 b1 c1 val2 -- group 1
a1 b1 c1 val3 -- group 1
a2 b2 c2 val1 -- group 2
a2 b2 c2 val2 -- group 2
a3 b3 c3 val1 -- group 3
a3 b3 c3 val2 -- group 3
我想为[c5]
,[c1]
和[c2]
的每个组合生成新列[c3]
的值。所需的输出类似于:
[C1] [C2] [C3] [C4] [c5]
a1 b1 c1 val1 1
a1 b1 c1 val2 2
a1 b1 c1 val3 3
a2 b2 c2 val1 1
a2 b2 c2 val2 2
a3 b3 c3 val1 1
a3 b3 c3 val2 2
对于[c1]
,[c2]
和[c3]
的每一组,它们将始终相同。您可以将3列的组合视为主键。
答案 0 :(得分:3)
这将需要两个查询。第一个查询你需要改变表来添加新列...我只是把这些varchar作为我的一面看起来像...
<强> SETUP:强>
CREATE TABLE my_table
(c1 VARCHAR(55)
,c2 VARCHAR(55)
,c3 VARCHAR(55)
,c4 VARCHAR(55)
);
INSERT INTO my_table VALUES
('a1' , 'b1' , 'c1', 'val1'),
('a1' , 'b1' , 'c1', 'val2'),
('a1' , 'b1' , 'c1', 'val3'),
('a2' , 'b2' , 'c2', 'val1'),
('a2' , 'b2' , 'c2', 'val2'),
('a3' , 'b3' , 'c3', 'val1'),
('a3' , 'b3' , 'c3', 'val2');
第一次查询:
ALTER TABLE my_table
ADD COLUMN c5 VARCHAR(55);
这里我们刚刚添加了一个新列...称为c5。
第二次查询:
UPDATE my_table mt,
(
SELECT
c4,
c1,
IF(@A = c1, @B := @B + 1, @B := 1) AS new_col,
@A := c1
FROM my_table
CROSS JOIN(SELECT @A := '', @B := 1)t
) temp
SET mt.c5 = new_col
WHERE mt.c4 = temp.c4
AND mt.c1 = temp.c1;
这里我们做一些计算,为每种类型增加一个计数,并在它到达一个新类型时重置。然后在同一查询中更新表
THIRD QUERY:
SELECT * FROM my_table;
只是查看所做更改的方法。
<强>输出:强>
+---+---+---+-------+--+
|c1 |c2 |c3 |c4 |c5|
+---+---+---+-------+--+
|a1 |b1 |c1 |val1 |1 |
|a1 |b1 |c1 |val2 |2 |
|a1 |b1 |c1 |val3 |3 |
|a2 |b2 |c2 |val1 |1 |
|a2 |b2 |c2 |val2 |2 |
|a3 |b3 |c3 |val1 |1 |
|a3 |b3 |c3 |val2 |2 |
+---+---+---+-------+--+
<强>奖金:强>
只是为了好玩,如果您不想在表格中创建新列,也可以运行查询。像这样:
SELECT c1, c2, c3, c4, new_col as c5
FROM
(
SELECT
*,
IF(@A = c1, @B := @B + 1, @B := 1) AS new_col,
@A := c1
FROM my_table
CROSS JOIN(SELECT @A := '', @B := 1)t
) as _outer_