2

现在这是一个有趣的 MySQL 问题,我想知道它是否可能!

免责声明:虽然这是我之前提出的非常相似的问题,但实际上完全不同。只是在有人说我以前问过这个之前说。

对于这个例子,假设我想要SUMS()20 的倍数。

我想要SUM()行得分并返回日期。

假设我有下表按以下顺序排序date ASC

数据

score |   date
  4     2000-01-01
  2     2000-01-02
  6     2000-01-03
  1     2000-01-04 //Score 4+2+6+1 = 13
  7     2000-01-05 //Score 4+2+6+1+7 = 20 so return this date
  1     2000-01-06
  2     2000-01-07
  1     2000-01-08
  5     2000-01-09
  1     2000-01-10
  9     2000-01-11 //Score = 39 so far.
  7     2000-01-12 //Score = 46 It's not 40 but is the closest number above 40 so return it.
  3     2000-01-13
  4     2000-01-14
  7     2000-01-15 //Score = 60, return this date.

预期成绩:

score | date
 20     2000-01-05
 40     2000-01-12
 60     2000-01-15

等等。是否可以在 MySQL 中执行此操作?

4

2 回答 2

3

当然,一切皆有可能:)

select
    floor(partial / 20) * 20, min(date)
from
    (select
        (select sum(score) from Scores s2
         where s2.date <= s.date) as partial,
        score,
        date
    from
        Scores s) p
where
    floor(partial / 20) > 0
group by
    floor(partial / 20)

演示:http ://www.sqlfiddle.com/#!2/d44cf/3

于 2012-04-17T00:40:00.310 回答
3

通过使用 SQL 变量,您不必继续对每个后续行进行递归聚合以计算给定实体。这将依次使用一个标志触发 20 的倍数。然后仅在“ThisOne”标志设置为 1 的情况下处理该结果。

select 
      M20.*
   from 
      ( select 
              TransDate,
              score,
              if( @runTotal + Score >= 20 * @multCnt, 1, 0 ) as ThisOne,
              @multCnt := @multCnt + if( @runTotal + Score >= 20 * @multCnt, 1, 0 ) as nextSeq,
              @runTotal := @runTotal + Score
           from Mult20s,
                ( select @multCnt := 1,
                         @runTotal := 0 ) sqlvars
           order by transdate ) M20
   where
      M20.ThisOne = 1
于 2012-04-17T00:43:29.777 回答