Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка минимального значения  [new]
=Lucky=
Member

Откуда:
Сообщений: 353
Господа, добрый день.
полазил по сайту, но так и не нашел ответ на интересующий меня вопрос.
Собственно, после выборок формируется временная таблица.В которой данные формата:
IDкомпонента;IDцены;цена

мне нужно сделать так, чтобы для каждого из компонентов была только минимальная цена, но этого никак не получается.
select IDкомпонента,IDцены,min(цена) from A
group by IDкомпонента,IDцены,цена
получаю 2 разные цены для одного IDкомпонента

select IDкомпонента,min(цена) from A
group by IDкомпонента,цена
Получаю то что мне нужно,НО мне нужно знать IDцены!
Помогите!Весь мозг сломал.
6 июл 09, 12:18    [7380002]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
типа мимо проходил
Guest
=Lucky=,

select IDкомпонента,min(цена) from A
group by IDкомпонента,цена

а если его теперь заджойнить с основной таблицей по цене и компоненту?
6 июл 09, 12:24    [7380034]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
А если строк с минимальной ценой несколько?
6 июл 09, 12:29    [7380069]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
йцу1
Guest
select IDкомпонента,IDцены,min(цена) from A
group by IDкомпонента,IDцены,цена
из group by цену убери
6 июл 09, 12:35    [7380114]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
Если для цен, где несколько видов цен минимально для компонента, выбирать любую то уменя получилось так:

select IDкомпонента, minc,
  (select top 1 IDцены
   from (
      select IDкомпонента, IDцены, min(Цена ) minc
      from A
      group by IDкомпонента, IDцены
    ) t2
    where t2.IDкомпонента = t1.IDкомпонента
      and t2.minc = t1.minc
  ) as IDцены
from
  (select IDкомпонента, min(Цена) minc
  from A
  group by IDкомпонента) t1
6 июл 09, 12:52    [7380242]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
йцу1
Guest
i2akai1
Если для цен, где несколько видов цен минимально для компонента, выбирать любую то уменя получилось так:

select IDкомпонента, minc,
  (select top 1 IDцены
   from (
      select IDкомпонента, IDцены, min(Цена ) minc
      from A
      group by IDкомпонента, IDцены
    ) t2
    where t2.IDкомпонента = t1.IDкомпонента
      and t2.minc = t1.minc
  ) as IDцены
from
  (select IDкомпонента, min(Цена) minc
  from A
  group by IDкомпонента) t1


ох уж эти ужасные селекты!!
6 июл 09, 13:00    [7380295]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
_raddd
Guest
select IDкомпонента, IDцены, цена
from A As A1
WHERE цена = (SELECT MIN(цена) FROM A As A2 WHERE A2.IDкомпонента = A1.IDкомпонента)
6 июл 09, 13:01    [7380304]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
йцу1,

Можно join-ом и IDЦены выбирать по min или max, но и так тож нормально
а красивее конечно с join :)
6 июл 09, 13:11    [7380376]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
=Lucky=
Member

Откуда:
Сообщений: 353
йцу1
select IDкомпонента,IDцены,min(цена) from A
group by IDкомпонента,IDцены,цена
из group by цену убери

И это ничего не изменит...
6 июл 09, 13:36    [7380595]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
=Lucky=
Member

Откуда:
Сообщений: 353
iap
А если строк с минимальной ценой несколько?

;-)....легко top(1)...эх..если бы в этом была проблема
6 июл 09, 13:37    [7380605]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
=Lucky=
Member

Откуда:
Сообщений: 353
i2akai1
Если для цен, где несколько видов цен минимально для компонента, выбирать любую то уменя получилось так:

select IDкомпонента, minc,
  (select top 1 IDцены
   from (
      select IDкомпонента, IDцены, min(Цена ) minc
      from A
      group by IDкомпонента, IDцены
    ) t2
    where t2.IDкомпонента = t1.IDкомпонента
      and t2.minc = t1.minc
  ) as IDцены
from
  (select IDкомпонента, min(Цена) minc
  from A
  group by IDкомпонента) t1

Спасибо..сейчас попробую
6 июл 09, 13:38    [7380615]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
=Lucky=
iap
А если строк с минимальной ценой несколько?

;-)....легко top(1)...эх..если бы в этом была проблема
А ну-ка! Посмотрим...

Кстати, версия сервера засекречена?
6 июл 09, 13:41    [7380644]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
=Lucky=
iap
А если строк с минимальной ценой несколько?

;-)....легко top(1)...эх..если бы в этом была проблема
А ну-ка! Посмотрим...

Кстати, версия сервера засекречена?
Хотя, судя по TOP(1), версия не ниже 90.
Тогда всё просто:
WITH CTE AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY IDкомпонента ORDER BY цена DESC) N FROM A)
SELECT * FROM CTE WHERE N=1;
6 июл 09, 13:43    [7380671]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Или короче (но медленнее)
SELECT TOP 1 WITH TIES *
FROM A
ORDER BY ROW_NUMBER() OVER(PARTITION BY IDкомпонента ORDER BY цена DESC);
6 июл 09, 13:46    [7380689]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Прошу прощения!
Это я для максимальных цен написал!
DESC из запросов надо убрать!
6 июл 09, 13:47    [7380700]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
=Lucky=
Member

Откуда:
Сообщений: 353
_raddd
select IDкомпонента, IDцены, цена
from A As A1
WHERE цена = (SELECT MIN(цена) FROM A As A2 WHERE A2.IDкомпонента = A1.IDкомпонента)

Неправильно, если одинаковая цена у разных компонентов
6 июл 09, 13:55    [7380772]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
йцу1
Guest
=Lucky=
йцу1
select IDкомпонента,IDцены,min(цена) from A
group by IDкомпонента,IDцены,цена
из group by цену убери

И это ничего не изменит...


сначала делаешь выборку во временную таблицу
select IDкомпонента,min(цена) from A
group by IDкомпонента

потом апдейтишь поле IDцены
6 июл 09, 14:06    [7380862]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
_raddd
Guest
=Lucky=
_raddd
select IDкомпонента, IDцены, цена
from A As A1
WHERE цена = (SELECT MIN(цена) FROM A As A2 WHERE A2.IDкомпонента = A1.IDкомпонента)

Неправильно, если одинаковая цена у разных компонентов


...дык скажите - какой в таком случае надо выбирать?
select IDкомпонента, MIN(IDцены) As IDцены, цена
from A As A1
WHERE цена = (SELECT MIN(цена) FROM A As A2 WHERE A2.IDкомпонента = A1.IDкомпонента)
GROUP BY IDкомпонента, цена
6 июл 09, 14:21    [7380975]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
=Lucky=
Member

Откуда:
Сообщений: 353
iap
iap
=Lucky=
iap
А если строк с минимальной ценой несколько?

;-)....легко top(1)...эх..если бы в этом была проблема
А ну-ка! Посмотрим...

Кстати, версия сервера засекречена?
Хотя, судя по TOP(1), версия не ниже 90.
Тогда всё просто:
WITH CTE AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY IDкомпонента ORDER BY цена DESC) N FROM A)
SELECT * FROM CTE WHERE N=1;

Спасибо!!!
Здесь получается что CTE как бы временная таблица?
Не скиншь ссылочку где можно почитать о таком приёме и насколько он грузит сервак
6 июл 09, 15:16    [7381409]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
йцу1
Guest
это все долго будет работать.
сделай как я предлагал, быстрее не бывает!
6 июл 09, 15:22    [7381463]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
=Lucky=
Спасибо!!!
Здесь получается что CTE как бы временная таблица?
Не скиншь ссылочку где можно почитать о таком приёме и насколько он грузит сервак
CTE - это "Common Table Expression"
6 июл 09, 15:23    [7381470]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
=Lucky=
Member

Откуда:
Сообщений: 353
iap
=Lucky=
Спасибо!!!
Здесь получается что CTE как бы временная таблица?
Не скиншь ссылочку где можно почитать о таком приёме и насколько он грузит сервак
CTE - это "Common Table Expression"

Еще раз спасибо!
Только я не понял немного, т.е вот так я сделать не могу:
WITH CTE AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY IDкомпонента ORDER BY цена DESC) N 
                    FROM  <моя выборка, например,select * from X inner join J on..... >)
SELECT * FROM CTE WHERE N=1;
?
6 июл 09, 15:52    [7381672]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
=Lucky=
Member

Откуда:
Сообщений: 353
=Lucky=
iap
=Lucky=
Спасибо!!!
Здесь получается что CTE как бы временная таблица?
Не скиншь ссылочку где можно почитать о таком приёме и насколько он грузит сервак
CTE - это "Common Table Expression"

Еще раз спасибо!
Только я не понял немного, т.е вот так я сделать не могу:
WITH CTE AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY IDкомпонента ORDER BY цена DESC) N 
                    FROM  <моя выборка, например,select * from X inner join J on..... >)
SELECT * FROM CTE WHERE N=1;
?


Сорри ступил...можно всё...Вопрос снят
6 июл 09, 15:54    [7381684]     Ответить | Цитировать Сообщить модератору
 Re: Выборка минимального значения  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
=Lucky=
iap
=Lucky=
Спасибо!!!
Здесь получается что CTE как бы временная таблица?
Не скиншь ссылочку где можно почитать о таком приёме и насколько он грузит сервак
CTE - это "Common Table Expression"

Еще раз спасибо!
Только я не понял немного, т.е вот так я сделать не могу:
WITH CTE AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY IDкомпонента ORDER BY цена) N 
                    FROM  X inner join J on..... )
SELECT * FROM CTE WHERE N=1;
?
6 июл 09, 15:58    [7381706]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить