Как получить только вторую, третью, четвертую или пятую строку результата запроса? (SQL SERVER 2000) - PullRequest
1 голос
/ 12 февраля 2009

Мне нужно предложение или даже решение, как получить только вторую, третью ... строку результата запроса с высокой производительностью. Я знаю, что есть возможность row_number (SQL Server 2005 или выше), но не для SQL Server 2000 :-(

Моя первая попытка получить пятый ряд была:
ВЫБЕРИТЕ ТОП 1 цв
ОТ (ВЫБЕРИТЕ ТОП 5 кол
ОТ стола
ЗАКАЗАТЬ по кол.) Q
ЗАКАЗАТЬ по col DESC

Я пытаюсь объяснить свои требования: в моей таблице может быть макс. 5 рядов на одного человека. Но если существует только 4 строки для этого человека, я получу неправильный результат с моим запросом выше.

Есть предложения?

Любая помощь будет оценена!

Спасибо вперед, С наилучшими пожеланиями, Андреас

Ответы [ 5 ]

1 голос
/ 12 февраля 2009

Чтобы получить 5-ю строку, вы можете использовать несколько подзапросов, таких как:

select top 1 MyCol from MyTable
where MyCol = 
(
    select top 1 MyCol from 
    (
        select top 5 MyCol from MyTable order by MyCol
    ) t order by MyCol desc
)
1 голос
/ 12 февраля 2009

Вероятно, лучший и самый быстрый способ сделать это - просто выбрать топ-5 в хранилище данных и просто читать следующее в памяти по мере необходимости.

0 голосов
/ 07 августа 2011

Вот еще один пример. Этот использует временную таблицу со столбцом идентификации.

SELECT TOP 5 IDENTITY(int) as id, col
  INTO #t
  FROM table
 ORDER BY col

SELECT col FROM #t WHERE id = 5

DROP TABLE #t
0 голосов
/ 12 февраля 2009

Это должно сделать это ...

CREATE PROCEDURE [dbo].[sp_UpdateSkills]
AS
BEGIN
    set nocount on

    declare @UserID int
    declare @Skill varchar(1)
    declare @SkillCount int

    declare @Skill1 varchar(1)
    declare @Skill2 varchar(1)
    declare @Skill3 varchar(1)
    declare @Skill4 varchar(1)
    declare @Skill5 varchar(1)

    declare csrUser cursor for
        select distinct UserID
        from dbo.tblSkills1
        order by 1

    open csrUser

    fetch next from csrUser into @UserID
    while (@@fetch_status = 0)
    begin
        declare csrSkill cursor for
            select Skill
            from dbo.tblSkills1
            where UserID = @UserID
            order by Skill

        set @SkillCount = 1
        set @Skill1 = null
        set @Skill2 = null
        set @Skill3 = null
        set @Skill4 = null
        set @Skill5 = null

        open csrSkill

        fetch next from csrSkill into @Skill
        while (@@fetch_status = 0 and @SkillCount < 6)
        begin
            print @UserID
            print @Skill

            if (@SkillCount = 1)
                set @Skill1 = @Skill
            else if (@SkillCount = 2)
                set @Skill2 = @Skill
            else if (@SkillCount = 3)
                set @Skill3 = @Skill
            else if (@SkillCount = 4)
                set @Skill4 = @Skill
            else if (@SkillCount = 5)
                set @Skill5 = @Skill

            set @SkillCount = @SkillCount + 1

            fetch next from csrSkill into @Skill
        end

        close csrSkill
        deallocate csrSkill

        insert into tblSkills2
        (UserID, Skill1, Skill2, Skill3, Skill4, Skill5)
        values
        (@UserID, @Skill1, @Skill2, @Skill3, @Skill4, @Skill5)

        fetch next from csrUser into @UserID
    end

    close csrUser
    deallocate csrUser
END
0 голосов
/ 12 февраля 2009

Если я правильно понимаю, вы хотите, чтобы строка возвращалась, если на самом деле есть, например, 5-я строка. В этом случае вы можете сделать это:

SELECT TOP 1 col
FROM (
    SELECT TOP 5 col
    FROM table
    where (SELECT COUNT(*) FROM table) >= 5
    ORDER BY col
) q
ORDER BY col DESC
...