我正在使用MySQL5.6。
这是我的源表:
form_unique_identifier field_number field_label total_drop_off total_visitors
FA11567953 0 Name 4 100
FA11567953 1 Dropdown 5 100
FA11567953 3 File 32 100
FA11567953 4 Multi select field 10 100
FA45345345 0 Name 1 233
FA45345345 11 Dropdown 7 233
FA45345345 31 File 2 233
FA45345345 44 Multi select field 3 233
FA45345356 2 Name 5 77
FA45345356 4 Dropdown 1 77
FA45345356 6 File 7 77
FA45345356 8 Multi select field 6 77
我正在努力寻找 total_field_visitors
.
公式是- total_field_visitors = total_visitors - total_drop_off of prior record
我需要基于 form_unique_identifier
并按 field_number
.
我写了这个查询,但似乎效果不好:
UPDATE table1 a
inner join table1 b
on a.form_unique_identifier = b.form_unique_identifier AND a.field_number < MIN(b.field_number)
SET a.total_field_visitors = a.total_visitors - b.total_drop_off
如果它是第一个字段,那么total\ field\ visitors应该设置为等于total\ visitors。
这是我的输出表:
form_unique_identifier field_number field_label total_drop_off total_visitors total_field_visitors
FA11567953 0 Name 4 100 100
FA11567953 1 Dropdown 5 100 96
FA11567953 3 File 32 100 91
FA11567953 4 Multi select field 10 100 59
FA45345345 0 Name 1 233 233
FA45345345 11 Dropdown 7 233 232
FA45345345 31 File 2 233 225
FA45345345 44 Multi select field 3 233 223
FA45345356 2 Name 5 77 77
FA45345356 4 Dropdown 1 77 72
FA45345356 6 File 7 77 71
FA45345356 8 Multi select field 6 77 64
4条答案
按热度按时间uoifb46i1#
您的问题与另一个依赖于“running total”上下文且不使用复杂功能的问题非常相似。它完全可以使用mysql@variables。。。
sql fiddle答案
准备工作是通过一个查询声明mysql变量来完成的,只是将它们默认为空字符串和零。别名sqlvars没有连接,因为它只返回一行,并且永远不会导致笛卡尔结果。现在我们设定了值。。。最后一个窗体唯一标识符(@lastfui)和每个窗体的运行总丢弃量。
我包括额外的列来显示处理每一行时值的进程。很明显,您可以根据需要删除或添加更多内容。
行“t1.total\u visitors-if()”基本上是说明我所在的记录是否与最后一个表单id相同,然后从总数中减去最后一行中丢弃的记录数。如果是另一种形式,不要减去任何东西。
接下来,@totdropoff:=行基本上正在检查。。。如果我上一个窗体与我现在使用的窗体唯一id相同,我想将总累计放弃计数设置为等于上一个记录的总数加上现在放弃的总数。如果表单唯一id不同,只需将@totdropoff=此新记录上的衰减计数设置为在其后续表单记录上显示的基础。
只有在正确设置了累计总数之后,我们才希望将当前记录的表单唯一id保留到变量中,以便下次比较。
ORDERBY子句对于确保按照您在需求中指定的唯一id和字段号按顺序处理数据至关重要。
对于另一个类似的问题和解释(如果你需要一个稍微不同的方法),请查看这篇mysql文章
ovfsdjhp2#
你在找什么
SUM
有窗口功能,但只支持8.0以上的mysql版本。有另一种方法可以做到。
使用子查询
select
待办事项SUM
具有窗口功能。架构(mysql v5.6)
查询#1
db fiddle视图
如果你想做
UPDATE
只是使用UPDATE ... JOIN
架构(mysql v5.6)db fiddle视图
vnzz0bqm3#
首先,你可以用前一个子句计算不包括第一行的累计和,然后从total\u visitor列中减去它。你可以试试下面的查询-
这是小提琴-https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b8bd73ce6d971c590ba747c181de8469
djp7away4#
您只需在
SELECT
条款:你可以用上面的
UPDATE
通过细微的调整: