Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.11;
Скачать: CL | DM;

Вниз

Запрос для   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
3-32702
AlexNic
2002-03-20 22:34
2002.04.11
Работа с InterBase


4-33020
GL
2002-02-12 14:55
2002.04.11
Кнопка Windows


14-32983
Dimich
2002-02-28 12:00
2002.04.11
Где можно взять драйвер для Mustek 12000sp+ под Win XP


1-32849
Deus
2002-03-28 19:03
2002.04.11
StayOnTop


1-32727
ola
2002-03-29 06:04
2002.04.11
Help!!!! Помогите, уважаемые мастера....