powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск минимального значения
14 сообщений из 14, страница 1 из 1
Поиск минимального значения
    #32074612
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Есть таблица цен товаров:
price
id post item
и значений цен:
price_val
id parent date value

нужно для каждого price.item выбрать одну строку
с min(price_val.value), price.id=price_val.parent, price_val.date > "20.11.02", price_val.value>0
создать таблицу:
price.item, price_val.value, price_val.date, price.post

делаю:

select price.item, price_val.value, price_val.date, price.post
from price
left join period
on price.id=price_val.parent
where price_val.date > '20.11.02' and price_val.value = (
select min(price_val1.value)
from price price1, price_val price_val1
where price1.id=price_val1.parent and price_val1.date > '20.11.02' and price_val1.value >0 and price1.item=price.item
)
order by price.item

получается по несколько строк на каждый item, когда за разные date и post были одинаковые value

Как изменить запрос так, чтобы для каждого item возвращалась только одна строка?
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32074621
pandre1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такой оператор distinct
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32074625
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
select distinct - результат тотже
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32074626
av2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
примерно так:

select price.item,
(SELECT TOP 1 price_val.value WHERE price_val.date > '20.11.02' AND price_val.item = price.item ORDER BY price_val.value) AS price_v,
(SELECT TOP 1 price_val.date WHERE price_val.date > '20.11.02' AND price_val.item = price.item ORDER BY price_val.value) AS price_date
FROM price
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32074630
Bzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше сразу использовать GROUP - явно скоро агрегирующие придется применять!
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32074638
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Был вариант

select price.item, min(price_val.value), max(price_val.date), max(price.post)
from price,price_val
where price_val.date > '20.11.02' and price.id=price_val.parent and price_val.value >0
group by price.item

но - результат неверный
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32074858
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что такое post
ну привели бы скрипты таблиц и примерных данных...
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32074864
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
declare @price table(id int identity( 1 , 1 ), post char( 5 ),item varchar( 10 ))
declare @price_val table(id int identity( 1 , 1 ),parent int,dates datetime,val decimal( 18 , 3 ))
insert @price(post,item) 
select '???','item1' union all
select '???','item2' union all
select '???','item3' 
insert @price_val(parent,dates,val)
select  1 ,'20021010' , 28 . 75  union all
select  1 ,'20021110', 29 . 75  union all
select  1 ,'20021121', 30 . 75  union all
select  1 ,'20021122', 31 . 75  union all
select  2 ,'20021010', 128 . 75  union all
select  2 ,'20021110', 129 . 75  union all
select  2 ,'20021121', 130 . 75  union all
select  2 ,'20021122', 130 . 75  
select * from @price
select * into #t
from @price_val
where dates > '20021120' and val> 0 
select t.*,max(#t.dates) 
from	(select parent,min(val) val
	from #t
	group by parent) t join 
            #t on t.parent=#t.parent and t.val=#t.val
group by t.parent,t.val
 -- из условия max(pos)---
 
select *
from (select p.id,p.post,p.item
      from (select item,max(post) from @price group by item)i
               join @price p on i.item=p.item and i.post=p.post) pr
      join
	(select t.*,max(#t.dates)  -- #t.id если понадобится
 
	 from	(select parent,min(val) val
		 from #t
		 group by parent) t join 
	            #t on t.parent=#t.parent and t.val=#t.val
	 group by t.parent,t.val)pv 
      on pr.id=pv.parent
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32074880
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
select * from
(select *, 
(select top  1  id from @price_val b where b.parent = a.id and b.dates > '20021120' order by b.dates) as price_val_id from @price a) a
left outer join @price_val b on b.id = a.price_val_id
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32075296
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Получилось следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select b.item,a1.date,a1.value,b.post
from price b (nolock)
inner join price_val a1
on a1.id=(
select top  1  a.id
from price_val a (nolock), price b1 (nolock)
where a.date >'01.11.02' and a.value> 0  and a.parent=b1.id and b1.item=b.item
order by  a.value
) and b.id=(
select top  1  a2.parent
from price_val a2 (nolock), price b3 (nolock)
where a2.date >'01.11.02' and a2.value> 0  and a2.parent=b3.id and b3.item=b.item
order by  a2.value
)
order by b.item


результат верный. Вопрос - вложенные запросы - одинаковые, как сделать тоже, используя один вложенный запрос?
Что - то типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select b.item,a1.date,a1.value,b.post
from price b (nolock)
inner join price_val a1
(
select top  1  a.id,a.parent
from price_val a (nolock), price b1 (nolock)
where a.date >'01.11.02' and a.value> 0  and a.parent=b1.id and b1.item=b.item
order by  a.value
)
on a1.id=a.id and b.id=a.parent
order by b.item


Возможно ли такое?
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32075337
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Why you don't want use my query ?
Maybe because it use ordering by date not by price ?
If it's the point, so here you are "another" variant

Код: plaintext
1.
2.
3.
4.
select * from
(select *, 
(select top  1  id from @price_val b where b.parent = a.id 
and b.dates > '20021120' and b.value >  0  order by b.value) as price_val_id from @price a) a
left outer join @price_val b on b.id = a.price_val_id


Возможно ли такое?
2.No
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32075723
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
2 Glory
такой вариант не подходит. Фильтрация будет до уровня price.id, а нужно до price.item. На каждый price.item может быть несколько записей с разными price.post - поставщиками.

price price_val

id item post id parent date value
1 t1 p1 1 1 21.11.02 100
2 t1 p2 2 1 22.11.02 102
3 t1 p3 3 2 21.11.02 99
4 t2 p1 4 3 20.11.02 103
5 t2 p4 5 3 23.11.02 101
6 t3 p2 6 4 21.11.02 54
7 t4 p1 7 4 22.11.02 57
8 t4 p2 8 4 24.11.02 56
9 t5 p1 9 5 22.11.02 55
10 t5 p3 10 5 23.11.02 53

результат должен быть такой:
t1 21.11.11 100 p1
t2 23.11.11 53 p4
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32075744
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select b.item,a.date,a1.value,b.post
from price b (nolock)
       inner join price_val a
       on a.id=b.id
       and a.id=(select top  1  a1.parent
                      from price_val a1 (nolock), price b1 (nolock)
                      where a1.date >'01.11.02' and a1.value> 0  and a1.parent=b1.id and b1.item=b.item
                      order by  a2.value)
order by b.item

но это все равно не эффективно...
на больших данных группировка работает намного быстрее...
...
Рейтинг: 0 / 0
Поиск минимального значения
    #32075821
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
2 Mice - был такой вариант - результата так и не дождался.

Вот через where:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select b.item,a1.date,a1.value,b.post
from price b , price_val a1 where
a1.id=(select top  1  a.id
from price_val a, price b1
where a.date >'01.11.02' and a.value> 0  and a.parent=b1.id and b1.item=b.item
order by  a.value)
and
b.id=(select top  1  a.parent
from price_val a , price b1
where a.date >'01.11.02' and a.value> 0  and a.parent=b1.id and b1.item=b.item
order by  a.value)
order by b.item


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


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