Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > SELECT TOP (COUNT(*) - N) FROM ..


Автор: puZzo 12.4.2011, 09:46
Добрый день Уважаемые)
В таблице есть N записей, как выбрать из них только последние за выбранный промежуток времени, зная только сколько у меня уже есть из этого промежутка записей, но не зная сколько записей в этом промежутке всего? есть только уже прочитанные, нужно дополнить недостоющими.. т.е.:

Таблица:
1з 2з 3з 4з 5з 6з 7з 8з 9з 10з ...  (N записей)

В моей программе есть из этой таблицы 6 первых..
нужно недостающие забрать, но я не знаю сколько записей всего..

ключ уникальный есть, время записей не уникально, отслеживать по ключу не вариант.

Код

SELECT *
FROM table a
WHERE (NOT EXISTS (
    SELECT TOP 6 * FROM (
        SELECT * FROM table b 
        WHERE (Time BETWEEN @time1 AND @time2)
        ORDER BY Time DESC) c
    WHERE a.Ключ = c.Ключ))


запрос ни к черту, я его и так и сяк..чет не могу никак сообразить как все таки сделать..
процедуры кстати тоже не вариант..

Автор: Zloxa 12.4.2011, 10:08
Цитата(puZzo @  12.4.2011,  09:46 Найти цитируемый пост)
выбрать из них только последние за выбранный промежуток времени, зная только сколько у меня уже есть из этого промежутка 


Код

select *
from(
  SELECT a.*
    ,row_number() over (order by Time desc)
  FROM table a
  WHERE Time BETWEEN @time1 AND @time2
)
where rn > 6
ORDER BY Time DESC

Автор: puZzo 13.4.2011, 03:13
Код

SELECT *
FROM (
      SELECT tabl.*, 
      row_number() OVER (ORDER BY TimeEvent DESC) AS 'RowNumber'
      FROM [zavod].[dbo].[FireFly] tabl
      WHERE (TimeEvent BETWEEN '2011/04/12' AND '2011/04/13')
     ) AS Z
WHERE RowNumber > 6
ORDER BY TimeEvent DESC


ругается:
Сообщение 242, уровень 16, состояние 3, строка 2
Преобразование типа данных varchar в тип данных datetime привело к выходу значения за пределы диапазона.

Блин, вместо '2011/04/12' надо '12/04/2011'

Добавлено @ 03:22
Полностью рабочий как мне надо вариант))
Код

SELECT *
FROM (
      SELECT tabl.*, 
      row_number() OVER (ORDER BY TimeEvent ASC) AS 'RowNumber'
      FROM [zavod].[dbo].[FireFly] tabl
      WHERE (TimeEvent BETWEEN '12/04/2011 00:00:00' AND '13/04/2011 00:00:00')
     ) AS Z
WHERE RowNumber > 6
ORDER BY TimeEvent


Zloxa, Спасибо!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)