чайниковский вопрос

вопрос
Дата: 03.12.2000 07:26:42
Совсем недавно начал изучать SQL и возникла тривиальная задача. Нужно вернуть из таблицы предпоследнюю запись. Как это можно сделать наилучшим образом без использования курсоров.
baxxtor
Дата: 03.12.2000 08:34:21
что значит предпоследняя запись? по дате? по ID? по чему? по какому закону одна запись "старше" другой в твоей таблице?
baxxtor
Дата: 03.12.2000 08:54:08
как кариант....

есть таблица (user_statuses) с двумя полями:
user_status_id int
statusname varchar(32)

Есть три записи:
1 - Active
2 - Disabled
3 - Deleted

Задача: взять запись с предпоследним значением поля user_status_id (последнее - 3). Имеем следующий запрос:

select top 1 *
from user_statuses
where user_status_id < (select max(user_status_id) from user_statuses)
order by user_status_id desc
вопрос
Дата: 03.12.2000 19:12:16
По дате. Т.е нужно взять предпоследнюю из добавленных если у каждой добавленной более старшая дата. Главное правильно вопрос поставить спасибо за помощь
SergSuper
Дата: 04.12.2000 07:30:47
Попробую дать более глобальный ответ, заодно может кто меня подправит или чего посоветует.

Допустим есть таблица остатков по счетам по датам
create table #state (
account varchar(30),
date datetime,
saldo money)
Нам надо узнать какие были изменения по счетам за заданный день. Для этого нужно выбрать все записи за данную дату, а потом каждую сравнить с предыдущей по дате записью.

В принципе можно написать так:
select s1.date, s1.saldo saldo_new, s2.date date_old,s2.saldo saldo_old
from #state s1,#state s2
where s1.date=@date and s1.account=s2.account
and s2.date=(select max(date) from #state s3 where s3.date<@date and s3.account=s1.account)
Это должно работать, но если большое количество записей то результата можно прождать долго. Ну и конечно должна быть обязательно предыдущая запись.
Поэтому приходиться использовать временные таблицы:
select account into #a from #state where date=@date
Таблица #a используется чтобы уменьшить количество счетов, по которым будут выбираться данные. В принципе можно обойтись и без неё.
select s.account, max(date) d
into #d from #state s, #a a
where a.account=s.account
group by s.account

select s1.date, s1.saldo saldo_new, s2.date date_old,s2.saldo saldo_old
from #state s1,#state s2, #d d
where s1.date=@date and s1.account=s2.account
and s2.date=d.d and s1.account=d.account

Но всё что я тут написал - естественно не догма(да и ошибки могут быть), не исключено что есть более лучшие способы.

С приветом Сергей
PS. To вопрос: С данными надо работать, а не с записями
baxxtor
Дата: 05.12.2000 07:44:50
сегодня один парень подсказал еще более правильное решение этой задачи:

есть таблица (user_statuses) с двумя полями:
user_status_id int
statusname varchar(32)

Есть три записи:
1 - Active
2 - Disabled
3 - Deleted

Задача: взять запись с предпоследним значением поля user_status_id (последнее - 3). Имеем следующий запрос:

select top 2 @status_name = status_name
from user_statuses
order by user_status_id desc

Работать вроде быстрее должна, но надо все равно кост посмотреть.