Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Отбор последних внесенных записей


Автор: Ptica 20.12.2004, 16:18
Господа!
Подскажите, как составить SQL-запрос. Задача приблизительно следующая. Есть таблица с бухгалтерскими проводками. Для каждой проводки есть код поставщика. Поставщиков много. По каждому поставщику есть множество проводок. Необходимо составить запрос так, чтобы его результат включал по одной записи для каждого поставщика, причем это должны быть записи проводок, внесенные последними. Например, по поставщику 001 были проводки в среду, четверг и пятницу, так вот в результат запроса должна попасть только пятничная проводка. А по поставщику 567 единственная проводка была год назад, и она тоже должна войти в запрос, как "последняя для данного поставщика". При определении "последнести" проводки решающую роль играет хронология физического внесения записей (сортировка идет по коду поставщика, а затем по автоинкрементному полю). Можно ли обойтись одним запросом, без организации циклов, промежуточных таблиц и т.д.?

Автор: AntonSaburov 20.12.2004, 16:22
Так через MAX() и в условии поставить HAVING - разве не получиться ?

Автор: boevik 20.12.2004, 16:30
Ptica, скорее всего запрос в запросе поможет решить проблему.
Внутрений запрос, что б найти max для каждого поставщика, внешний - выдать проводку.

Для более детального обсуждение, требуется структура таблицы.

Автор: Akina 20.12.2004, 16:38
Не понимаю... если дата/время коррекции - критична, то почему в структуре нет даты/времени внесения коррекции записи?

Автор: Ptica 20.12.2004, 17:41
В общем, вот к чему я пока пришел:
Код

select kod,summa from provodki where rowid in (select max(rowid) from provodki group by kod) order by kod

Если есть что-то лучшее, предлагайте! Для простоты можно считать, что структура базы такая:
Код

CREATE TABLE [dbo].[provodki] (
[rowid] [int] IDENTITY (1, 1) NOT NULL ,
[kod] [int] NOT NULL ,
[summa] [numeric] NOT NULL
) ON [PRIMARY]

Akina
Вопрос правомерен. Просто я по ряду причин посчитал для себя удобным иметь в структуре автоинкрементное поле, а дату/время внесения записей пока не использовал, хотя ее тоже, наверное, неплохо бы иметь... я подумаю.

Автор: boevik 20.12.2004, 17:48
Цитата(Ptica @ 20.12.2004, 17:41)
Код

select kod,summa from provodki where rowid in (select max(rowid) from asd group by kod) order by kod

На это я и намекал. smile

Можно ещё такой запрос:
Код

select kod,summa from provodki о
where rowid = (select max(rowid) from asd i where о.kod = i kod group by kod) order by kod

Но не уверен, что он лучше твоего

Автор: Akina 20.12.2004, 18:01
Ptica
Цитата(Ptica @ 20.12.2004, 18:41)
Просто я по ряду причин посчитал для себя удобным иметь в структуре автоинкрементное поле, а дату/время внесения записей пока не использовал, хотя ее тоже, наверное, неплохо бы иметь...

Мало того что наличие и того, и другого поля не противоречит логике - оно вполне уместно. Автоинкремент ака счетчик - ключевое поле, а дата/время коррекции - информационное. Причем в твоем случае оно содержит значимые данные.

Автор: Ptica 21.12.2004, 09:49
Спасибо всем откликнувшимся! smile

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