在MySQL中创建一个新列,它是另一列的移位版本,具有空行?

时间:2015-07-21 09:34:12

标签: mysql

我认为最好用一个例子来询问。

说我的原始表名为origin并且是

+-------+-------+-------+------+
|list_s | list  | type  | date |
+-------+-------+-------+------+
| NULL  | a1    | a     | 1    |
|  a1   | a2    | a     | 2    |
|  a2   | a3    | a     | 3    |
|  a3   | a4    | a     | 4    |
|  a4   | a5    | a     | 5    | 
|  a5   | a6    | a     | 6    |
| ...   | ...   | ...   | ...  |
|a(n-2) | a(n-1)| a     | (n-1)|
|a(n-1) | an    | a     | n    |
| NULL  | b1    | b     | 1    |
|  b1   | b2    | b     | 2    |
|  b2   | b3    | b     | 3    |
|  b3   | b4    | b     | 4    |
|  b4   | b5    | b     | 5    | 
|  b5   | b6    | b     | 6    |
| ...   | ...   | ...   | ...  |
+-------+-------+-------+------+

我想添加一个名为list_shifted(list_s)的列,其中

!DIR$ SIMD

有一种简单的方法吗

2 个答案:

答案 0 :(得分:0)

看起来列listlist_s都依赖于其他两列。

我会质疑是否需要这些列,您可以在查询数据时始终构建所需的列。

list

SELECT CONCAT(type,date) list
  FROM origin

list_s

SELECT CASE 
         WHEN date - 1 > 0 THEN CONCAT(type,date - 1)
         ELSE NULL
       END CASE list_s
  FROM origin

答案 1 :(得分:0)

这是两个可以解决您问题的查询。

如果您的日期列在每个下一行(对于每种类型)增加1,那么第一个就像您在问题示例中从1到5发布它总是1,2,3,4,5然后您可以简单地制作一个RIGHT JOIN是这样的:

SELECT ts.list, tx.*
FROM (SELECT `list`, type, `date`
      FROM t1) AS ts
RIGHT JOIN t1 AS tx
ON ts.type = tx.type AND ts.date = (tx.date - 1);

第二个是解决方案,如果日期不是按照确切的顺序排列(如果删除了某些行或类似的东西),则从1到5的数字不必使所有这些都像1,2,5 ...然后你可以使用临时变量(当然可以在第一种情况下使用,但查询有点复杂),就像这样。

SELECT CASE WHEN type_s = type THEN list_s ELSE null END AS list_s, `list`, type, `date`
FROM (SELECT @prev AS list_s, @prev := tx.list AS `list`, 
             @prevTyp AS type_s, @prevTyp := tx.type AS type, tx.date
      FROM (SELECT @prev := null) AS i, (SELECT @prevTyp := null) AS y, t1 AS tx
      ORDER BY tx.type, tx.date) AS myTable;

这两个查询都是SQL Fiddle,以查看它是如何工作的。

注意注释插入值时的一行。我这样做,所以你可以看到第一个查询的“问题”在哪里! (如果你取消注释,它将按照你想要的结果工作)。

GL!

P.S。如果您有任何问题,请填写下面的评论...