максимум записей с плотным рангом - PullRequest
0 голосов
/ 22 июня 2011

Есть ли лучшая альтернатива использованию max для получения максимальных записей. Я играл с плотным рангом и разделом по приведенному ниже запросу но я получаю нежелательные результаты и плохую работу.

select Tdate = (Select  max(Date)  
                    from Industries 
                    where Industries.id = i.id 
                        and Industries.Date <= '22 June 2011')
    from #ii_t i

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 22 июня 2011

В поставляемом запросе не используется оконная функция DENSE_RANK .Не будучи знакомым с вашей структурой данных, я полагаю, что ваш запрос пытается найти наибольшее значение Date для каждого идентификатора отрасли, да?Переписав вышеупомянутый запрос для использования функции ранжирования, я бы написал ее как общее табличное выражение.

;
WITH RANKED AS
(
    SELECT
        II.*
    -- RANK would serve just as well in this scenario
    ,   DENSE_RANK() OVER (PARTITION BY II.id ORDER BY II.Date desc) AS most_recent
    FROM Industries II
    WHERE
        II.Date <= '22 June 2011'
)
, MOST_RECENT AS
(
    -- This query restricts it to the most recent row by id
    SELECT
        R.*
    FROM
        RANKED R
    WHERE 
        R.most_recent = 1
)
SELECT
    *
FROM
    MOST_RECENT MR
    INNER JOIN
        #ii_t i
        ON i.id = MR.id

Кроме того, для решения вопроса производительности вам может понадобиться посмотреть на структуру отраслей.В этой таблице может отсутствовать индекс, и, если он есть, он может не охватывать поле Дата (по убыванию) и идентификатор.Чтобы повысить эффективность вышеупомянутого запроса, не тяните все назад в разделе RANKED.Я сделал это, так как не знал, какие поля вам понадобятся, но, очевидно, чем меньше вам придется отступать, тем эффективнее механизм извлечения данных.

0 голосов
/ 22 июня 2011

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

select Tdate = max(Industries.Date)    
from #ii_t i
  left outer join Industries
    on Industries.id = i.id and
       Industries.Date <= '22 June 2011'
group by i.id
0 голосов
/ 22 июня 2011

Какую базу данных вы используете? Если вы работаете в Oracle, вы можете написать немного pl / sql с циклом, который ищет максимальное значение (это не так эффективно, но возможно). Если вы хотите построить запрос для этого, вы должны поиграть с аналитическими функциями.

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