2017-06-12 13 views
1

私は株式データベースのクエリを書いており、毎年の価格上昇の上位5つの株式(2010年〜2016年)を探しています。今、私はこのようにそれを書いています:このクエリを書くためのより良い/より簡潔な方法がありますか?

(
    SELECT Ticker, Year, MAX(High - Low) 
    FROM Stocks 
    WHERE Year = 2010 
    GROUP BY Ticker 
    ORDER BY MAX(High - Low) DESC 
    LIMIT 5 
) 
UNION ALL 
(
    SELECT Ticker, Year, MAX(High - Low) 
    FROM Stocks 
    WHERE Year = 2011 
    GROUP BY Ticker 
    ORDER BY MAX(High - Low) DESC 
    LIMIT 5 
) 
UNION ALL 

と、毎年2016

まで、create table文であることを繰り返し:

CREATE TABLE Stocks (
    Year DATE 
    Ticker VARCHAR(8), 
    High FLOAT, 
    Low FLOAT, 
    Volume FLOAT, 
    PRIMARY KEY(Ticker, Year) 
); 

し、得られたデータセットものになるだろうこのように:

Year Ticker MAX(High - Low) 
--------------------------------- 
2010 GOOG  100 
2010 FB  99 
2010 AAPL  98 
2010 NFLX  97 
2010 ABCD  96 
2011 FB  120 
2011 ABCD  112 
etc... (Top 5 in terms of high-low per year) 

これを書くには、より簡潔な方法がありますか?

+0

はい。 https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-queryを参照してください。 – Strawberry

+0

@Strawberry申し訳ありませんが、私の質問にそのリンクがどのように答えるかはわかりません。私はcreate tableステートメントと望みの結果セットを追加して答えやすいようにすべきだと言っていますか? –

+0

他にどのような解釈がありますか? – Strawberry

答えて

-1

INステートメントを試すことができます。

SELECT Ticker, Year, MAX(High - Low) 
FROM Stocks 
WHERE Year IN ('2010', '2011', '2012', '2013', '2014', '2015', '2016') 
GROUP BY Ticker 
ORDER BY MAX(High - Low) DESC 

これが役に立ちます。

+0

私はすべてを一緒に組み合わせるだろうと確信しています。あなたは、毎年トップ5の代わりに2010-2016年の期間全体でトップ5になるでしょう。 – manassehkatz

+0

これはおそらく、フィールドごとのグループではないためエラーになるので、年ごとにグループ化する必要があります(MYSQLはこれを無視できますが、そうしないでください) –

関連する問題