我认为最好用一个例子来询问。
说我的原始表名为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
有一种简单的方法吗
答案 0 :(得分:0)
看起来列list
和list_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。如果您有任何问题,请填写下面的评论...