株式市場のデータを格納するデータベースがあります。
stockId、date、およびvolumeの3 つの列を持つテーブルがあります。
取引日ごとに新しいデータがテーブルに挿入されます。
「過去 10 取引日の各株式の平均出来高」のような結果を得るにはどうすればよいですか?
http://sqlfiddle.com/#!6/c8dbb/4
CREATE TABLE Stocks
([StockId] int, [Date] DateTime, [Volume] int)
;
INSERT INTO Stocks
([StockId], [Date], [Volume])
VALUES
(1, GetDate(), 1000),
(1, GetDate()+1, 2000),
(1, GetDate()+2, 4000),
(2, GetDate(), 1000),
(2, GetDate()+1, 1000),
(2, GetDate()+2, 500)
;
Select StockId, AVG(Volume) [AverageVolume]
FROM Stocks
WHERE [Date] >= DATEADD(dd, 0, DATEDIFF(dd, 0, GetDate())) - 10
Group by StockId
Order by StockId
これは Dodecapus の回答に基づいており、他の回答に与えたコメントに基づいています。回答にクエリを含めているだけですが、データを使用した実際の例については sqlfiddle を確認してください。
http://sqlfiddle.com/#!6/91599/2
SELECT
StockId
,AVG(Volume) [AverageVolume]
FROM Stocks
WHERE [Date] IN
(
SELECT DISTINCT TOP 10 [Date] FROM Stocks ORDER BY [Date] DESC
)
GROUP BY StockId
ORDER BY StockId
これは、取引日ごとに出来高のある銘柄が少なくとも 1 つ記録されている場合にのみ機能します。
SELECT SUM(volume)/10 FROM table_name
Where date Between Cast('7/18/13 12:01:01' As DateTime) And Cast('7/08/13 12:01:01' as DateTime)
SELECT AVG(volume) FROM mytable WHERE date >= (CURDATE() - INTERVAL 10 DAY)
編集:
過去 10 日間のグループとその平均。
SELECT AVG(volume) FROM mytable GROUP BY date ORDER BY date DESC LIMIT 10
書くのが楽しい小さなクエリ。ここにあります:
SELECT AVG(x.Volume) FROM (SELECT Volume FROM StockTable WHERE Date BETWEEN
DATE_ADD(NOW(), INTERVAL -10 DAY) AND NOW())x
これは、私が作業するサンプル テーブルを作成するために使用したものですSQLFiddle
。
CREATE TABLE StockTable (ID INT PRIMARY KEY AUTO_INCREMENT NOT NULL, Date DATETIME, Volume INT);
INSERT INTO StockTable (Date, Volume) VALUES (DATE_ADD(NOW(), INTERVAL 12 DAY), 1000), (DATE_ADD(NOW(), INTERVAL 1 DAY), 5000),
(DATE_ADD(NOW(), INTERVAL 0 DAY), 3000), (DATE_ADD(NOW(), INTERVAL -11 DAY), 6000), (DATE_ADD(NOW(), INTERVAL -5 DAY), 4000), (DATE_ADD(NOW(), INTERVAL 7 DAY), 9000);
これは、実行中のクエリの SQLFiddle へのリンクです。
クエリの背後にあるアイデア:過去 10 日間のボリュームのみを含む派生テーブル を作成します。x
次に、そのテーブルに含まれるボリュームの平均を計算します。ほら!
編集:
他の回答やコメントを読んだ後、あなたが探しているものを具体的に理解しました. 過去 10 日間の株式市場の各株式の平均を取得しようとしています。
これからサンプルテーブルを作成しました:
CREATE TABLE StockTable (StockId INT NOT NULL, Date DATETIME, Volume INT);
INSERT INTO StockTable (StockId, Date, Volume) VALUES (1, DATE_ADD(NOW(), INTERVAL 6
DAY), 1000), (2, DATE_ADD(NOW(), INTERVAL 1 DAY), 5000),
(2, DATE_ADD(NOW(), INTERVAL 0 DAY), 3000), (3, DATE_ADD(NOW(), INTERVAL -8 DAY),
6000), (1, DATE_ADD(NOW(), INTERVAL -5 DAY), 4000),
(2, DATE_ADD(NOW(), INTERVAL 7 DAY), 9000);
結果を取得するクエリは次のとおりです。
SELECT StockId, AVG(Volume) FROM StockTable WHERE Date BETWEEN DATE_ADD(NOW(),
INTERVAL -10 DAY) AND NOW() GROUP BY StockId
これは、実行中のクエリの SQLFiddle へのリンクです。