8

(最初に私の問題を説明します。以下の表(クエリの例)は http://sqlfiddle.com/#!2/8ec17/4で入手できます)

次のように、株式情報の表があります。

sp100_id  _date         bullishness  returnpct
----------------------------------------------
1         2011-03-16    1.01         -0.33
1         2011-03-17    0.85         -1.28
1         2011-03-18    0.89          1.25
1         2011-03-21    1.46          1.21
1         2011-03-22    0.39         -2.53
2         2011-03-16    3.07          1.27
2         2011-03-17    2.09         -0.80
2         2011-03-18    0.91         -0.12
2         2011-03-21    1.50          0.00
2         2011-03-22    2.62          1.10
3         2011-03-16    0.73         -1.13
3         2011-03-17    1.13          1.21
3         2011-03-18    1.12          0.45
3         2011-03-21    1.00          1.01
3         2011-03-22    1.00         -0.53
4         2011-03-16    0.40          1.10
4         2011-03-17    2.40          0.03
4         2011-03-18    3.16         -0.10
4         2011-03-21    0.86          0.50
4         2011-03-22    1.00          0.10

私が必要なのは:

  • 連続する3日ごとに、各企業の平均強気を計算します(sp100_id
  • returnpct平均強気が最も高い会社の3日目を取り、それを保管します
  • returnpct最後に、保存されているreturnpctsを合計して合計を計算します

この例には5_date秒あるため、次の連続する日のペアを作成する必要があります。

  • 2011-03-16、、2011-03-17_2011-03-18
  • 2011-03-17、、(注意してください、2011-03-19は表にありません2011-03-182011-03-21
  • 2011-03-18、、2011-03-21_2011-03-22

必要なものに戻るには:

  • 最初の3日間の「勝者」は、平均ブルシネスが(3.07 + 2.09 + 0.91)/ 3 = 2.0233で、3日目のリターンが-0.12の会社2です。他の2つの「日付範囲」の勝者は、会社4(平均ブルシネス2.14およびreturnpct 0.50)と会社2(ブルシネス1.67、returnpct 1.10)です。
  • -0.12、0.50、1.10の値を保存する必要があります
  • その場合、合計returnpctは-0.12 + 0.50 + 1.10 = 1.48になります。これは、クエリ(またはスクリプト)から返される必要があります。

問題1:上記の例に関して、私のクエリは3日目(-0.12)returnpctではなく1日目(1.27)を返します。returnpctどうすればこれを変更できますか?

問題2: sqlfiddleで、3日間連続して最初のグループをハードコーディングしました。すべてのクエリを手動で入力する必要がないように、これを(おそらくphpを使用して)自動化するにはどうすればよいですか?表に日付がないことに注意してください。例のように、スクリプトはテーブルで次に利用可能な日付を取得する必要があります(したがって、テーブルにないためで2011-03-18はなく、後になります)2011-03-212011-03-19

問題3:この例では、連続3日を使用していますが、理想的には、スクリプトを簡単に変更して、他の連続日数(たとえば、2、4、または8日)を取ることができます。したがって、それぞれ2日目、4日目、または8日目の返品を保管する必要があります。

私がここで経験している問題のいくつかについて、誰が私を助けてくれますか?どんな助けでも大歓迎です:-)

4

1 に答える 1

3

次のクエリは、やりたいことに大いに役立ちます。3日間の平均を計算し、各日付内の注文を最高の平均で計算します。

SELECT s.sp100_id, s._date,
       (s.bullishness+splus1.bullishness+splus2.bullishness)/3 as avgb,
       splus2.returnpct
FROM (select s3.*,
             (select min(_date)
                    from stocks s4
                    where s4.sp100_id  = s3.sp100_id and
                          s4._date > s3.dateplus1
                   ) as dateplus2
      from (select s.*,
                   (select min(_date)
                    from stocks s2
                    where s2.sp100_id  = s.sp100_id and
                          s2._date > s._date
                   ) as dateplus1
            from stocks s
           ) s3
     ) s left outer join
     stocks splus1
     on s.sp100_id = splus1.sp100_id and
        s.dateplus1 = splus1._date left outer join
     stocks splus2
     on s.sp100_id = splus2.sp100_id and
         s.dateplus2 = splus2._date
order by 2, 3 desc

この時点で、mysqlの使用は面倒になります。これは、analytic / windows関数と「with」ステートメント(mysql以外のほぼすべてのデータベース(Oracle、Postgres、DB2、SQL Serverなど)をサポートするデータベース)でははるかに簡単です。

MySQLで(3)を1つのクエリで実行できますが、それは面倒です。アプリケーション層でそれを行うことをお勧めします。

ちなみに、SQLフィドルを設定していただきありがとうございます。理由だけで、私は質問に賛成します。

于 2012-08-18T14:54:52.743 に答える