Python 在mysql中,是否可以基于一列中的值添加一列?
我有一个mysql表数据,它有以下列Python 在mysql中,是否可以基于一列中的值添加一列?,python,mysql,Python,Mysql,我有一个mysql表数据,它有以下列 +-------+-----------+----------+ |a | b | c | +-------+-----------+----------+ | John | 225630096 | 447 | | John | 225630118 | 491 | | John | 225630206 | 667 | | John | 225630480 | 1215 |
+-------+-----------+----------+
|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仅在计算记录后应用。