Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在mysql中,是否可以基于一列中的值添加一列?_Python_Mysql - Fatal编程技术网

Python 在mysql中,是否可以基于一列中的值添加一列?

Python 在mysql中,是否可以基于一列中的值添加一列?,python,mysql,Python,Mysql,我有一个mysql表数据,它有以下列 +-------+-----------+----------+ |a | b | c | +-------+-----------+----------+ | John | 225630096 | 447 | | John | 225630118 | 491 | | John | 225630206 | 667 | | John | 225630480 | 1215 |

我有一个mysql表数据,它有以下列

+-------+-----------+----------+
|a      | b         | c        |
+-------+-----------+----------+
| John  | 225630096 |      447 |
| John  | 225630118 |      491 |
| John  | 225630206 |      667 |
| John  | 225630480 |     1215 |
| John  | 225630677 |     1609 |
| John  | 225631010 |     2275 |
| Ryan  | 154247076 |     6235 |
| Ryan  | 154247079 |     6241 |
| Ryan  | 154247083 |     6249 |
| Ryan  | 154247084 |     6251 |
+-------+-----------+----------+
我想根据
a
c
中的值添加一列
d
(请参见下表)。
a
中的值是主题的名称,
b
是其属性之一,
c
是另一个属性。因此,如果每个受试者的
c
值彼此相差在15个单位以内,则为其分配相同的聚类编号(例如,
Ryan
c
中的每个值都在15个单位以内,因此它们都被分配为1),但如果不分配一个与
John
不同的值,其中,每行为
d
获取不同的值

+-------+-----------+----------+---+
|a      | b         | c        |d  |
+-------+-----------+----------+---+
| John  | 225630096 |      447 | 1 |
| John  | 225630118 |      491 | 2 |
| John  | 225630206 |      667 | 3 |
| John  | 225630480 |     1215 | 4 |
| John  | 225630677 |     1609 | 5 |
| John  | 225631010 |     2275 | 6 |
| Ryan  | 154247076 |     6235 | 1 |
| Ryan  | 154247079 |     6241 | 1 |
| Ryan  | 154247083 |     6249 | 1 |
| Ryan  | 154247084 |     6251 | 1 |
+-------+-----------+----------+---+
我不确定这是否可以在mysql中实现,但如果不能,我也欢迎任何基于python的答案,在这种情况下,以cdv格式处理这个表


谢谢。

您可以使用带有变量的查询:

SELECT a, b, c,
       CASE WHEN @last_a != a THEN @d:=1
            WHEN (@last_a = a) AND (c>@last_c+15) THEN @d:=@d+1
            ELSE @d END d,
       @last_a := a,
       @last_c := c
FROM
  tablename, (SELECT @d:=1, @last_a:=null, @last_c:=null) _n
ORDER BY a, c
请看小提琴

解释

我正在使用
tablename
和子查询
(选择…\n
之间的连接来初始化一些变量(d初始化为1,@last\u a初始化为null,@last\u c初始化为null)

然后,对于每一行,我将检查最后遇到的a(前一行上的a)是否与当前a不同:在这种情况下,将@d设置为1(并返回它)

如果最后遇到的a与当前行相同,且c大于最后遇到的c+15,则递增@d并返回其值

否则,只需返回d而不增加它。当a未更改且c不大于之前的c+15时,或在第一行发生(因为@last_a和@last_c已初始化为null)


为了让它正常工作,我们需要按a和c进行订购。

我不确定我在这里如何使用触发器,有类似的例子吗?您的规范不充分。John445和Ryan7000John 445在447的15个单位范围内被分配为1,Ryan 7000在Ryan的15个单位范围内被分配为2……希望这能有所帮助。这是有效的:),但我不明白怎么做。如果你能详细阐述一下,那就太好了。Thanks@mshakya我补充了一个解释,请看我更新的答案,希望一切都清楚谢谢。我认为现在这样做很有意义。请注意,这个解决方案只有在表按a,c排序时才有效。ORDER BY仅在计算记录后应用。