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 に答える