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

Откуда: Екатеринбург
Сообщений: 43
Добрый вечер.

Помогите вывести ID записи из которой я получаю MAX(price). Ни как не могу придумать простое и лёгкое решение.


CREATE TABLE #A(ID int IDENTITY (1, 1) NOT NULL, p1 float, p2 float, g1 int, g2 int) 
  INSERT #A(p1,p2,g1,g2) values(100,0,  1,1) 
  INSERT #A(p1,p2,g1,g2) values(200,300,1,1) 
  INSERT #A(p1,p2,g1,g2) values(10 ,100,1,1) 
  INSERT #A(p1,p2,g1,g2) values(600,500,1,1) 
  INSERT #A(p1,p2,g1,g2) values(700,600,1,1) 
  INSERT #A(p1,p2,g1,g2) values(0  ,800,1,1) 
  
  INSERT #A(p1,p2,g1,g2) values(1000,0,   1,2) 
  INSERT #A(p1,p2,g1,g2) values(2000,3000,1,2) 
  INSERT #A(p1,p2,g1,g2) values(100 ,1000,1,2) 
  INSERT #A(p1,p2,g1,g2) values(6000,5000,1,2) 
  INSERT #A(p1,p2,g1,g2) values(7000,6000,1,2) 
  INSERT #A(p1,p2,g1,g2) values(0   ,8000,1,2) 

select A.g1, A.g2, min(A.price)  from
(
select  id, g1,g2,
	case p2
		when 0 then p1
		else p2
	end as price
from #a
) A
group by A.g1,A.g2

Результат должен быть таким
IDG1G2Price
111100
7121000


select @@version
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
26 дек 09, 20:36    [8122440]     Ответить | Цитировать Сообщить модератору
 Re: помогите Select id, max () group by  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
WITH A AS (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p1,0),p2)) N, ID, g1, g2, ISNULL(NULLIF(p1,0),p2) price FROM #A)
SELECT ID, g1, g2, price FROM A WHERE N=1;
но я не понял, максимум нужен или минимум?
Почему это результат должен быть (1,7), а не (3,9)?
26 дек 09, 21:06    [8122487]     Ответить | Цитировать Сообщить модератору
 Re: помогите Select id, max () group by  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
WITH A AS (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p1,0),p2)) N, ID, g1, g2, ISNULL(NULLIF(p1,0),p2) price FROM #A)
SELECT ID, g1, g2, price FROM A WHERE N=1;
но я не понял, максимум нужен или минимум?
Почему это результат должен быть (1,7), а не (3,9)?
Напутал с p1 и p2
WITH A AS (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p2,0),p1)) N, ID, g1, g2, ISNULL(NULLIF(p2,0),p1) price FROM #A)
SELECT ID, g1, g2, price FROM A WHERE N=1;
Если надо по одной записи на группу (с равными price), то вместо RANK() - ROW_NUMBER()
26 дек 09, 21:12    [8122499]     Ответить | Цитировать Сообщить модератору
 Re: помогите Select id, max () group by  [new]
ИванПетрович
Member

Откуда: Екатеринбург
Сообщений: 43
Да прошу прощения, я ищу MIN(price).

Если искать MAX(price) то результат должен быть таким

IDG1G2Price
611800
12 1 2 8000
27 дек 09, 07:30    [8123133]     Ответить | Цитировать Сообщить модератору
 Re: помогите Select id, max () group by  [new]
ИванПетрович
Member

Откуда: Екатеринбург
Сообщений: 43
iap
iap
WITH A AS (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p1,0),p2)) N, ID, g1, g2, ISNULL(NULLIF(p1,0),p2) price FROM #A)
SELECT ID, g1, g2, price FROM A WHERE N=1;
но я не понял, максимум нужен или минимум?
Почему это результат должен быть (1,7), а не (3,9)?
Напутал с p1 и p2
WITH A AS (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p2,0),p1)) N, ID, g1, g2, ISNULL(NULLIF(p2,0),p1) price FROM #A)
SELECT ID, g1, g2, price FROM A WHERE N=1;
Если надо по одной записи на группу (с равными price), то вместо RANK() - ROW_NUMBER()


Спасибо iap, получилось, не первый раз выручаете!!!!!!!!!

P.S. Ещё меня мучает вопрос, вот эта комбинация
ISNULL(NULLIF(p2,0),p1)
быстрее работает чем

case p2
   when 0 then p1
   else p2
end

или нет?
27 дек 09, 07:46    [8123135]     Ответить | Цитировать Сообщить модератору
 Re: помогите Select id, max () group by  [new]
ИванПетрович
Member

Откуда: Екатеринбург
Сообщений: 43
WITH A AS (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p2,0),p1)) N, ID, g1, g2, ISNULL(NULLIF(p2,0),p1) price FROM #A)
SELECT ID, g1, g2, price FROM A WHERE N=1;

А вот так не получилось сделать, внутри у меня более сложный select, у меня пишет ошибку про синтаксис with, пришлось сделать вот так

select * from (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p2,0),p1)) N, ID, g1, g2, ISNULL(NULLIF(p2,0),p1) price FROM #A)
) w
where w.n=1;

Это по производительности хуже чем with ????
27 дек 09, 10:09    [8123170]     Ответить | Цитировать Сообщить модератору
 Re: помогите Select id, max () group by  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
ИванПетрович
WITH A AS (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p2,0),p1)) N, ID, g1, g2, ISNULL(NULLIF(p2,0),p1) price FROM #A)
SELECT ID, g1, g2, price FROM A WHERE N=1;

А вот так не получилось сделать, внутри у меня более сложный select, у меня пишет ошибку про синтаксис with, пришлось сделать вот так

select * from (SELECT RANK()OVER(PARTITION BY g1,g2 ORDER BY ISNULL(NULLIF(p2,0),p1)) N, ID, g1, g2, ISNULL(NULLIF(p2,0),p1) price FROM #A)
) w
where w.n=1;

Это по производительности хуже чем with ????
Это одно и то же.
А ошибка наверно про точку с запятой (semicolon)?

По поводу ISNULL(NULLIF()) всё очевидно: 0 заменяется на NULL, а этот NULL тут же заменяется на p1.
Вряд ли можно заметить разницу в скорости этой конструкции и первоначального CASE
27 дек 09, 11:41    [8123240]     Ответить | Цитировать Сообщить модератору
 Re: помогите Select id, max () group by  [new]
ИванПетрович
Member

Откуда: Екатеринбург
Сообщений: 43
Спасибо iap, всё понял.
28 дек 09, 05:35    [8125147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить