Помогите как написать запрос по требованию - PullRequest
2 голосов
/ 28 апреля 2010

Мне нужно написать запрос SQL-Server, но я не знаю, как решить. У меня есть таблица RealtimeData с данными:

 Time                   |    Value
4/29/2009 12:00:00 AM   |   3672.0000
4/29/2009 12:01:00 AM   |   3645.0000
4/29/2009 12:02:00 AM   |   3677.0000
4/29/2009 12:03:00 AM   |   3634.0000
4/29/2009 12:04:00 AM   |   3676.0000      // is EOD of day "4/29/2009"
4/30/2009 12:00:00 AM   |   3671.0000
4/30/2009 12:01:00 AM   |   3643.0000
4/30/2009 12:02:00 AM   |   3672.0000
4/30/2009 12:03:00 AM   |   3634.0000
4/30/2009 12:04:00 AM   |   3632.0000
4/30/2009 12:05:00 AM   |   3672.0000      // is EOD of day "4/30/2009"
5/1/2009 12:00:00 AM    |   3673.0000
5/1/2009 12:01:00 AM    |   3642.0000
5/1/2009 12:02:00 AM    |   3672.0000
5/1/2009 12:03:00 AM    |   3634.0000
5/1/2009 12:04:00 AM    |   3635.0000      // is EOD of day "5/1/2009"

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

   Time      |    Value
4/29/2009    |  3676.0000
4/30/2009    |  3672.0000
5/1/2009     |  3635.0000

Примечание: я пишу комментарий, чтобы вы могли знать, где находится EOD. И SQL Server версии 2005.

Примечание: данные в таблице RealtimeData очень большие и содержат более 400 000 строк. Пожалуйста, помогите мне написать в оптимизации.

Пожалуйста, помогите мне решить мою проблему. Спасибо.

Ответы [ 4 ]

3 голосов
/ 28 апреля 2010
WITH RankedRealTimeData AS (
  SELECT *, ROW_NUMBER() OVER (
      PARTITION BY CONVERT(VARCHAR(10), [TIME], 121) 
      ORDER BY Time DESC) AS RN
  FROM RealTimeData
)
SELECT * FROM RankedRealTimeData WHERE RN=1;
2 голосов
/ 28 апреля 2010
SELECT 
    CAST(Time as DATE) EodDate, 
    (
        SELECT  TOP 1
                Value
        FROM    RealtimeData I
        WHERE   CAST(I.Time AS Date) = CAST(O.Time AS Date)
        ORDER BY    Time DESC
    ) EodValue
FROM 
    RealtimeData O
GROUP BY CAST(Time as DATE)
ORDER BY CAST(Time as DATE)
0 голосов
/ 30 апреля 2010

; с wcte как ( Выберите vTime, vValue, Row_Number () более (разделить по Convert (DateTime, Convert (varchar (10), vTime, 110)) из @vTable ) Выберите vTime, vValue из wcte, где rno = 1

0 голосов
/ 28 апреля 2010

Использование Sql 92 - лучшее решение для тех, кто не хочет использовать указанную систему БД.

Как это:

Select A.*
From RealtimeData A
Where A.RTime >= (
    select Max(B.RTime)
    From RealtimeData B
    Where Cast((B.RTime - A.RTime) as int) <= 0
)
...