powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / чайниковский вопрос
6 сообщений из 6, страница 1 из 1
чайниковский вопрос
    #32000978
вопрос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совсем недавно начал изучать SQL и возникла тривиальная задача. Нужно вернуть из таблицы предпоследнюю запись. Как это можно сделать наилучшим образом без использования курсоров.
...
Рейтинг: 0 / 0
чайниковский вопрос
    #32000979
baxxtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что значит предпоследняя запись? по дате? по ID? по чему? по какому закону одна запись "старше" другой в твоей таблице?
...
Рейтинг: 0 / 0
чайниковский вопрос
    #32000980
baxxtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как кариант....

есть таблица (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
...
Рейтинг: 0 / 0
чайниковский вопрос
    #32000983
вопрос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По дате. Т.е нужно взять предпоследнюю из добавленных если у каждой добавленной более старшая дата. Главное правильно вопрос поставить спасибо за помощь
...
Рейтинг: 0 / 0
чайниковский вопрос
    #32000990
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую дать более глобальный ответ, заодно может кто меня подправит или чего посоветует.

Допустим есть таблица остатков по счетам по датам
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 вопрос: С данными надо работать, а не с записями
...
Рейтинг: 0 / 0
чайниковский вопрос
    #32001024
baxxtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сегодня один парень подсказал еще более правильное решение этой задачи:

есть таблица (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

Работать вроде быстрее должна, но надо все равно кост посмотреть.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / чайниковский вопрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]