我如何获得带有连续指标的总量?
How can i get the total amount with consecutive indicator?
所以这里是 table:
Name Indicator Amount
Anson 1 3.5
Anson 2 2.6
Anson 4 8.4
Anson 5 3.2
Ben 1 7
Ben 3 4.7
Ben 4 3.6
如果指标是连续的,如何获取总金额?
这是我想要的结果:
Name Indicator Amount
Anson 1,2 6.1
Anson 4,5 11.6
Ben 1 7
Ben 3,4 8.3
谢谢!
很遗憾,MySQL 没有 window 功能。但是,如果您有一个递增 1 的值序列,那么对于每个组,该序列与 Indicator
之间的差异将是恒定的。您可以使用变量创建这样的序列。
剩下的只是算术和聚合:
select name, group_concat(indicator), sum(amount)
from (select t.*, (@rn := @rn + 1) as rn
from table t cross join
(select @rn := 0) params
order by name, indicator
) t
group by name, (rn - indicator)
order by name, min(indicator);
试试这个,它在 Oracle 中有效,所以我认为它应该在 mysql 中。不太好看。。。用Lag函数带上前一个名字的指标和金额。然后找出指标之间的差异并将金额相加。最后使用CASE语句对返回结果进行格式化。
select name,
CASE diff WHEN 1 THEN to_char(prev_ind||','||indicator)
ELSE to_char(indicator) END as Indicator,
CASE diff WHEN 1 then to_char(sum_amount)
else to_char(amounnt) END as Amount
FROM (
select name, indicator, prev_ind, sum(indicator-prev_ind) as diff, amounnt,
sum(amounnt + prev_amount) sum_amount
from (
select name, indicator, lag(indicator,1,0) over (order by name) prev_ind, amounnt,
lag(amounnt,1,0) over (order by name) prev_amount
from tmp1
order by name, indicator
)
group by name, indicator, prev_ind, amounnt
order by name, indicator)
where diff != 2
order by name;
所以这里是 table:
Name Indicator Amount
Anson 1 3.5
Anson 2 2.6
Anson 4 8.4
Anson 5 3.2
Ben 1 7
Ben 3 4.7
Ben 4 3.6
如果指标是连续的,如何获取总金额? 这是我想要的结果:
Name Indicator Amount
Anson 1,2 6.1
Anson 4,5 11.6
Ben 1 7
Ben 3,4 8.3
谢谢!
很遗憾,MySQL 没有 window 功能。但是,如果您有一个递增 1 的值序列,那么对于每个组,该序列与 Indicator
之间的差异将是恒定的。您可以使用变量创建这样的序列。
剩下的只是算术和聚合:
select name, group_concat(indicator), sum(amount)
from (select t.*, (@rn := @rn + 1) as rn
from table t cross join
(select @rn := 0) params
order by name, indicator
) t
group by name, (rn - indicator)
order by name, min(indicator);
试试这个,它在 Oracle 中有效,所以我认为它应该在 mysql 中。不太好看。。。用Lag函数带上前一个名字的指标和金额。然后找出指标之间的差异并将金额相加。最后使用CASE语句对返回结果进行格式化。
select name,
CASE diff WHEN 1 THEN to_char(prev_ind||','||indicator)
ELSE to_char(indicator) END as Indicator,
CASE diff WHEN 1 then to_char(sum_amount)
else to_char(amounnt) END as Amount
FROM (
select name, indicator, prev_ind, sum(indicator-prev_ind) as diff, amounnt,
sum(amounnt + prev_amount) sum_amount
from (
select name, indicator, lag(indicator,1,0) over (order by name) prev_ind, amounnt,
lag(amounnt,1,0) over (order by name) prev_amount
from tmp1
order by name, indicator
)
group by name, indicator, prev_ind, amounnt
order by name, indicator)
where diff != 2
order by name;