Форум: "Базы";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
ВнизЗапрос для Найти похожие ветки
← →
KAA (2002-03-19 16:10) [0]Есть таблица "Склад": идентификатор (ключевое поле, автоматически увеличивается для каждой новой записи), наименование детали, цвет детали. В таблицу неограниченное число раз добавляют записи, указывая тип делтали и ее цвет.
Задача: У нас где-то задано кол-во деталей (N). Надо выбрать из таблицы последние поступившие на склад N деталей заданного наименования и заданного цвета.
← →
Johnmen (2002-03-19 16:22) [1]А последние поступившие - в каком смысле ?
За день, за год, за секунду ???
← →
Donal_Graeme (2002-03-19 16:33) [2]N последних :-)
думаю, что не получится кроме как тупо выбрать все записи заданного наименования и цвета, отсортировав их по дате, и затем взять N последних (или первых, в зависимости от сортировки)
← →
KAA (2002-03-19 16:39) [3]>Johnmen
Не важно за какой период, у нвых идентификатор больше будет.
>Donal_Graeme
Взять N первых, если использовать SELECT TOP 50 в MSSQL2000, кол-во можно задать константой, а надо прочитать из ппеременной.
← →
Lusha (2002-03-19 16:45) [4]А что работа с параметром не прокатывает?
← →
DiggerAbstract (2002-03-19 16:47) [5]что-то типа
SELECT
*
FROM
table T1
INNER JOIN (
SELECT
ROW_NUMBER() OVER(ORDER BY T.ID DESC) AS NUM,
T.ID
FROM
table T ) AS T2 ON T1.ID=T2.ID AND T2.NUM<= {N}
← →
Johnmen (2002-03-19 16:49) [6]>KAA © : Как по номеру можно определить степень новизны записи ? :)
← →
KAA (2002-03-19 17:13) [7]>Lusha
Имеется ввиду SELECT TOP @N ? Не проглатывает.
>DiggerAbstract
Это для какой SQL? Честно говоря я даже не знаю, как звучит аналог ROW_NUMBER() для MSSQL2000, да и с конструкцией OVER я еще не сталкивался.
← →
Lusha (2002-03-19 17:18) [8]>KAA
Имеется в виду
SELECT TOP :N ...
И в тексте программы
AnyQuery.ParamByName("N").AsInteger := n;
А на крайний случай всегда можно писать так...
AnyQuery.SQL.Text := Format("SELECT TOP %d...", [n]);
Удачи
← →
Donal_Graeme (2002-03-19 17:19) [9]хм...а где-то - это где? в программе, или в базе? если в программе, то можно делать динамический запрос, а если на сервере, то, наверное только двумя запросами...
← →
KAA (2002-03-19 17:22) [10]>Lusha
Имеется ввиду SELECT TOP @N ? Не проглатывает.
>DiggerAbstract
Это для какой SQL? Честно говоря я даже не знаю, как звучит аналог ROW_NUMBER() для MSSQL2000, да и с конструкцией OVER я еще не сталкивался.
← →
KAA (2002-03-19 17:36) [11]>Johnmen
Номер следующей записи будет больше предыдущей.
>Lusha
Один нюанс, это все пишется в хранимой процедуре на SQL сервере, т.е. исключительно средствами MSSQL.
>Donal_Graeme
Это хранимая процедура, не особо важно, либо принимать значение из параметра, либо из базы вытаскивать.
← →
sniknik (2002-03-19 17:47) [12]рабочая замена SELECT TOP @N ?
declare @N int
SET @N = 3
SET ROWCOUNT @N
select * from sc19
go
← →
Johnmen (2002-03-19 17:48) [13]>KAA © : Как по номеру можно определить степень новизны записи ? Не относительную (типа: N больше, значит свежее),
а абсолютную - запись N свежая, потому, что ...........
Так вот - почему же ???? :o))))))))))
← →
KAA (2002-03-19 17:57) [14]>Johnmen
По условию задачи, если запись была занесена позже, значит она считается более свежей. Нужно рассматривать N последних записей, удовлетворяющих условию.
← →
sniknik (2002-03-19 18:04) [15]Реляционные базы не понимают что такое первый или последний если не записать эту информацию в поле то задача не имеет решения.
← →
Johnmen (2002-03-19 18:13) [16]>KAA © : Какому же условию ?
← →
alehan (2002-03-19 18:13) [17]Если используется TADOQuery может попробовать свойство MaxRecords?
← →
sniknik (2002-03-19 18:21) [18]Люди это классическая задача по SQL называется - Нахождение "первого" входа. Решения не имеет так как у базы нет упорядоченной структуры. Записи хранятся там где удобнее самой SQL и первая запись может быть в середине а последняя в начале. Если не писать какое либо значение в поле (DataTime например или автоинкрементное поле) то ничего не выйдет и никакие свойства не помогут.
← →
KAA (2002-03-19 18:22) [19]>sniknik
Так я в самом начале написал, что есть поле, в котором и хранится это увеличивающееся число. Вообще можно добавить поле с датой добавления записи, вернее в моей таблице оно уже есть, но как показала практика, когда я вручную добавлял записи, это поле я проигнорировал, в автоувеличивающееся поле автоматически получило свое значение.
>Johnmen
Ну я установил такое правило. Если запись пришла позже, значит она обязательно получит номер больше чем у предыдущей записи и соответственно больше чем у все остальных. Нужно рассматривать только N последних.
>alehan
Что такое TADOQuery ?
← →
KAA (2002-03-19 18:25) [20]>sniknik
У меня есть поле с автоинкриментом
> идентификатор (ключевое поле, автоматически увеличивается для каждой новой записи)
← →
KAA (2002-03-19 18:27) [21]Если нужно, в базу будет добавлено поле с датой занесения записи.
← →
sniknik (2002-03-19 18:29) [22]Сорри пропустил.
← →
KAA (2002-03-19 18:36) [23]Вообщем SET ROWCOUNT @N решение, но есть еще одна задача.
Вторая задача. В результате работы одного селекта можно получить список цветов для определенной детали (кол-во их может быть любым) и для каждого цвета число N. Надо выбрать из таблицы по N деталей каждого заданного цвета, точно так же как и в первой задаче, выбирать надо N последних записей.
Т.е. если в таблице 60 зеленых гаек и 50 красных, а надо выбрать 20 последних пришеднших зеленых и 10 последних красных, в итоговой таблице должны быть 30 гаек (20 и 10).
← →
sniknik (2002-03-19 18:45) [24]Тогда так попробуй
declare @N int
SET @N = 7
SET ROWCOUNT @N
select * from CASHPAY where ...условие ... order by [ID] DESC
go
для максимума
ASC
для минимума
а для отбора разных по условию
UNION
можно даже одновременно максимум и минимум
select * from CASHPAY where ...условие ... order by [ID] DESC
UNION
select * from CASHPAY where ...условие ... order by [ID] ASC
← →
KAA (2002-03-19 18:48) [25]>sniknik
количество цветов может быть любым, отсюда неизвестно, скалько селектов мне придется собирать юниуном.
← →
KAA (2002-03-19 18:50) [26]>sniknik
Кроме того, N для каждого цвета должен быть свой.
← →
sniknik (2002-03-19 19:02) [27]тогда запрос должен быть составной и вызыватся через OPENQUERY
тогда можно и TOP использовать значение ему не переменной а строкой давать.
← →
sniknik (2002-03-19 19:09) [28]Упс.. UNION позволяет только последнюю сортировку так что так не получится
← →
sniknik (2002-03-19 19:17) [29]Да с UNION вообще както криво работает. Если поставить TOP в селекты то берется одно большее значение :(.
Но есть еще вариант последовательно скидывать селекты во временную таблицу. ? не пойдет ?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c