2

次の表を検討してください。

sp100_id  _date        open  close  bullishness
-----------------------------------------------
1         2011-03-14   100   110    2.23
1         2011-03-15   115   100    1.00
1         2011-03-16   110   110    0.85
2         2011-03-14    90    85    0.99
2         2011-03-15    95    90    0.30
2         2011-03-16    92   100    4.66
3         2011-03-14   200   220    1.50
3         2011-03-15   250   210    1.75
3         2011-03-16   200   150    0.80

と の間の各株の% returnとを計算し、それらをDESC でランク付けし、リターンとを計算したいと思います。次のクエリでうまくいくと思いました。bullishness2011-03-142011-03-16% returnsp100_id% returnaverage bullishness

SELECT 
  sp100_id, 
  AVG(bullishness) as bullishness, 
  ((`close`-`open`) / `open`) as return_pct   
FROM
  stocks 
WHERE _date = BETWEEN '2011-03-14' AND '2011-03-16' 
ORDER BY return_pct DESC

ただし、常に1行だけを返すようです。ただし、予想される出力は次のとおりです。

sp100_id return_pct                average bullishness
-----------------------------------------------------------
3        (150-200)/200 = -0.250   (1.50+1.75+0.80)/3 = 4.05
2        (100-90)/90   =  0.110   (0.99+0.30+4.66)/3 = 1.98
1        (110-100)/100 =  0.100   (2.23+1.00+0.85)/3 = 4.08

私は何を間違っていますか?

4

1 に答える 1

3

GROUP BYクエリで使用する必要があります。

SELECT 
  sp100_id, 
  AVG(bullishness) as bullishness, 
  (((SELECT `close` FROM stocks s2
   WHERE s2.sp100_id=s1.sp100_id ORDER BY _date DESC LIMIT 1)
    -(SELECT `open` FROM stocks s3
   WHERE s3.sp100_id=s1.sp100_id ORDER BY _date ASC LIMIT 1)) / 
     (SELECT `open` FROM stocks s3
   WHERE s3.sp100_id=s1.sp100_id ORDER BY _date ASC LIMIT 1)) as return_pct
FROM
  stocks s1
WHERE _date BETWEEN '2011-03-14' AND '2011-03-16' 
GROUP BY sp100_id
ORDER BY return_pct DESC

がない場合、すべてのレコードがグループ化されるGROUP BYため、1 つの結果行のみが返されます。AVG

ORDER BYとでサブクエリを使用して return_pct の計算を修正しましたLIMIT 1

ドキュメント: GROUP BY (集計) 関数

SQLフィドル

于 2012-08-21T22:38:58.583 に答える