0

株式市場のデータを格納するデータベースがあります。

stockIddate、およびvolumeの3 つの列を持つテーブルがあります。

取引日ごとに新しいデータがテーブルに挿入されます。

「過去 10 取引日の各株式の平均出来高」のような結果を得るにはどうすればよいですか?

4

5 に答える 5

1

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
于 2013-07-18T21:22:10.700 に答える
1

これは 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 つ記録されている場合にのみ機能します。

于 2013-07-19T18:39:19.717 に答える
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)
于 2013-07-18T21:11:13.630 に答える
1
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 
于 2013-07-18T21:19:05.413 に答える
0

書くのが楽しい小さなクエリ。ここにあります:

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 へのリンクです

于 2013-07-19T04:19:09.907 に答える