Напишите sql, чтобы получить последние данные - PullRequest
2 голосов
/ 06 мая 2010

У меня есть таблица в реальном времени с примерами данных:

Symbol     Date            Value
ABC     1/3/2009 03:05:01   327    -- is last data for 'ABC'
ABC     1/2/2009 03:05:01   326 
ABC     1/2/2009 02:05:01   323
ABC     1/2/2009 01:05:01   313
BBC     1/3/2009 03:05:01   458    -- is last data for 'BBC'
BBC     1/2/2009 03:05:01   454
BBC     1/2/2009 02:05:01   453
BBC     1/2/2009 01:05:01   423

Пожалуйста, помогите мне написать sql, чтобы вернуть последние данные для всех символов. Результат:

Symbol     Date            Value
ABC     1/3/2009 03:05:01   327
BBC     1/3/2009 03:05:01   458

P / s: я использую SQL Server 2005. А данные в реальном времени очень большие, пожалуйста, оптимизируйте SQL-код.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 06 мая 2010

При большом предположении , что Value увеличивается только при увеличении Date ...

SELECT Symbol, MAX(Date) AS Date, MAX(Value) AS Value
FROM YourTable
GROUP BY Symbol

Если это предположение не может быть сделано, тогда возникает проблема, поскольку у вас нет способа однозначно идентифицировать строку. Например, если у вас есть столбец IDENTITY, вы найдете запись для каждого символа с самой последней датой и самым высоким идентификатором. Без поля ID вы на самом деле не знаете, какая запись была последней для вставки (если есть 2 с одинаковой датой), поэтому нужно сделать что-то вроде выше.

Если у вас никогда не будет одинакового значения даты для данного символа (т. Е. Символ + Дата вместе являются уникальными), тогда вы можете сделать:

SELECT s.Symbol, s.Date, s.Value
FROM YourTable s
JOIN
(
    SELECT Symbol, MAX(Date) AS LatestDate
    FROM YourTable
    GROUP BY Symbol
) s2 ON s.Symbol = s2.Symbol AND s.Date = s2.LatestDate

В таком случае это не будет иметь значения, если значение будет только увеличиваться со временем.

0 голосов
/ 06 мая 2010

Вы также можете сделать подобрать подобный вариант

select Symbol,
       max(Date) as Date,
       (select Value from YourTable where Symbol = T1.Symbol and Date = max(T1.Date)) as Value
from YourTable T1
group by Symbol
0 голосов
/ 06 мая 2010

Ответ:

SELECT
*, 
ROW_NUMBER() OVER 
  (PARTITION BY Symbol
  ORDER BY Date DESC) Position
FROM
TableName
WHERE
Position=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...