|
чайниковский вопрос
|
|||
---|---|---|---|
#18+
Совсем недавно начал изучать SQL и возникла тривиальная задача. Нужно вернуть из таблицы предпоследнюю запись. Как это можно сделать наилучшим образом без использования курсоров. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2000, 07:26 |
|
чайниковский вопрос
|
|||
---|---|---|---|
#18+
что значит предпоследняя запись? по дате? по ID? по чему? по какому закону одна запись "старше" другой в твоей таблице? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2000, 08:34 |
|
чайниковский вопрос
|
|||
---|---|---|---|
#18+
как кариант.... есть таблица (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, 08:54 |
|
чайниковский вопрос
|
|||
---|---|---|---|
#18+
По дате. Т.е нужно взять предпоследнюю из добавленных если у каждой добавленной более старшая дата. Главное правильно вопрос поставить спасибо за помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2000, 19:12 |
|
чайниковский вопрос
|
|||
---|---|---|---|
#18+
Попробую дать более глобальный ответ, заодно может кто меня подправит или чего посоветует. Допустим есть таблица остатков по счетам по датам 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 вопрос: С данными надо работать, а не с записями ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2000, 07:30 |
|
чайниковский вопрос
|
|||
---|---|---|---|
#18+
сегодня один парень подсказал еще более правильное решение этой задачи: есть таблица (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 Работать вроде быстрее должна, но надо все равно кост посмотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2000, 07:44 |
|
|
start [/forum/topic.php?fid=46&fpage=3596&tid=1827566]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 138ms |
0 / 0 |