Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-32618
фл
2002-03-22 13:38
2002.04.11
глюки с кодировкой


1-32832
mike.dld
2002-03-28 17:45
2002.04.11
Это опять Я!


14-32961
Кулюкин Олег
2002-03-01 17:04
2002.04.11
Кому какие англоязычные конференции нравятся?


1-32898
Cupor
2002-03-29 19:08
2002.04.11
Панаели инструментов как в Photoshope


7-32992
Jazzy$
2002-01-18 16:41
2002.04.11
Добвить кнопку к окну





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский