Последняя запись SQL на группу с агрегированным столбцом - PullRequest
3 голосов
/ 22 декабря 2010

У меня есть таблица, похожая на эту:

STOCK_ID TRADE_TIME   PRICE     VOLUME  
123         1           5         100  
123         2           6         150  
456         1           7         200  
456         2           8         250

Для каждой акции я хочу получить самую последнюю цену (где самая последняя - это просто максимальная цена сделки) и совокупный объем, поэтому для приведенной выше таблицы я хочусм .:

123  6 250  
456  8 450 

Я только что обнаружил, что текущий запрос (не всегда) работает, то есть нет гарантии, что выбранная цена всегда самая последняя:

select stock_id, price, sum(volume) group by stock_id

Можно ли обойтись без подзапросов?Спасибо!

Ответы [ 4 ]

4 голосов
/ 22 декабря 2010

Поскольку вы не указали базу данных, которую вы используете, вот несколько общих SQL, которые будут делать то, что вы хотите.

SELECT
  b.stock_id,
  b.trade_time,
  b.price,
  a.sumVolume
FROM (SELECT
        stock_id, 
        max(trade_time) AS maxtime,
        sum(volume) as sumVolume
      FROM stocktable
      GROUP BY stock_id) a
INNER JOIN stocktable b
  ON b.stock_id = a.stock_id and b.trade_time = a.maxtime
3 голосов
/ 22 декабря 2010

В SQL Server 2005 и более поздних версиях вы можете использовать CTE (Common Table Expression), чтобы получить то, что вы ищете:

;WITH MaxStocks AS
(
    SELECT
        stock_id, price, tradetime, volume,
        ROW_NUMBER() OVER(PARTITION BY stock_ID ORDER BY TradeTime DESC) 'RowNo'
    FROM    
        @stocks
)
SELECT
    m.StockID, m.Price, 
    (SELECT SUM(VOLUME) 
     FROM maxStocks m2 
     WHERE m2.STock_ID = m.Stock_ID) AS 'TotalVolume'
FROM maxStocks m
WHERE rowno = 1

Поскольку вы хотите как последнюю сделку, так и объемиз всех сделок по каждой акции, я не понимаю, как вы могли бы сделать это полностью без подзапросов, однако ...

0 голосов
/ 23 апреля 2013

объявить таблицу @Stock (STOCK_ID int, TRADE_TIME int, PRICE int, VOLUME int)

вставить в значения @Stock (123,1,5,100), (123,2,6,150), (456,1,7,200), (456,2,8,250)

Выберите Stock_ID, Price, (выберите сумму (объем) из @Stock B, где B.Stock_ID = A.Stock_ID) Объем из @Stock A, где A.Trade_Time = (Выберите максимум (Trade_Time) из @Stock)

0 голосов
/ 22 декабря 2010
  select a.stock_id, b.price , sum(a.volume) from tablename a
       join (select stock_id, max(trade_time), price from tablename
             group by stock_id) b 
             on a.stock_id = b.stock_id
    group by stock_id
...