Самый быстрый / самый эффективный способ выполнить этот запрос SQL Server 2008? - PullRequest
0 голосов
/ 14 марта 2012

У меня есть таблица, которая содержит:

- идентификатор финансового инструмента

- цена

- дата, когда была зарегистрирована цена

- фактическое время, когда была зарегистрирована цена

-источник цены

Я хочу получить идентификатор индекса, последнюю цену, источник цены и дату этой последней цены для каждого инструмента, где источником является "L" или "R". Я предпочитаю источник от «L» до «R», но последняя цена более важна (поэтому, если у самой последней даты цены есть только источник «R» - возьмите это, но если для самой последней даты у нас обоих, возьмите «L» «).

Это SQL у меня есть:

SELECT tab1.IndexID, tab1.QuoteDate, tab2.Source, tab2.ActualTime FROM
    (SELECT IndexID, Max(QuoteDate) as QuoteDate FROM PricesTable GROUP BY IndexID) tab1
JOIN
    (SELECT IndexID, Min(Source) AS Source, Max(UpdatedTime) AS ActualTime, QuoteDate FROM PricesTable WHERE Source IN ('L','R') GROUP BY IndexID, QuoteDate) tab2
ON tab1.IndexID = tab2.IndexID AND tab1.QuoteDate = tab2.QuoteDate

Однако я также хочу извлечь поле цены, но не могу получить его из-за предложения GROUP BY. Я не могу извлечь цену без включения цены ни в GROUP BY, ни в агрегатную функцию.

Вместо этого мне пришлось присоединить приведенный выше код SQL к другому куску SQL, который просто получает цены и идентификаторы индекса и присоединяется к идентификатору индекса.

Есть ли более быстрый способ выполнить этот запрос?

РЕДАКТИРОВАТЬ: спасибо за ответы до сих пор. Можно ли получить какой-нибудь совет, который более эффективен с точки зрения производительности?

Спасибо

Ответы [ 2 ]

4 голосов
/ 14 марта 2012

Используйте ROW_NUMBER в подзапросе или CTE, чтобы упорядочить строки в том виде, в котором они вас интересуют, а затем просто выберите строки, расположенные в верхней части этого порядка. (Используйте PARITION, чтобы номера строк были переназначены, начиная с 1 для каждого IndexId):

;WITH OrderedValues as (
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY IndexID ORDER BY QuoteDate desc,Source asc) as rn
    FROM
        PricesTable
)
SELECT * from OrderedValues where rn=1
3 голосов
/ 14 марта 2012

Попробуйте:

select * from
(select p.*, 
        row_number() over (partition by IndexID 
                           order by QuoteDate desc, Source) rn
 from PricesTable p
 where Source IN ('L','R')
) sq
where rn = 1

(Этот синтаксис должен работать в относительно недавних версиях Oracle, SQLServer или PostgreSQL, но не будет работать в MySQL.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...