Помогите с запросом

rainurka
Дата: 20.01.2009 08:39:23
Доброго времени суток. Запутался в запросе.
Создается таблица:
create table test (id int primary key,pr_1 int,pr_2 int);
Таблица забивается данными:
1|1|1600
2|2|3200
3|3|4800
4|2|3200
5|3|5400
6|1|1800
7|3|5400
8|3|5400
9|1|1800
10|3|5400
11|3|5400
12|2|3600
13|1|2300
14|3|6900
15|1|2300
16|3|6900
17|1|2500
18|2|5000
19|2|5600
20|3|8400
21|1|3000
22|3|8400
23|2|6000
24|1|3000
25|3|8400

Запрос такой: как вытащить для каждого значения pr_1 два наибольших значения pr_2 Ну т.е. max pr_1 и второй по величине.

Самое простое, что пришло на ум это пронумеровать результат вот этого запроса и вывести первые два значения:

select pr_1,pr_2
from test
group by pr_1;


Может, кто-нибудь подскажет более изящное решение.
Заранее спасибо за ответы
pkarklin
Дата: 20.01.2009 09:05:30
DECLARE @test TABLE(id int primary key,pr_1 int,pr_2 int)
INSERT @test VALUES
(1,1,1600),
(2,2,3200),
(3,3,4800),
(4,2,3200),
(5,3,5400),
(6,1,1800),
(7,3,5400),
(8,3,5400),
(9,1,1800),
(10,3,5400),
(11,3,5400),
(12,2,3600),
(13,1,2300),
(14,3,6900),
(15,1,2300),
(16,3,6900),
(17,1,2500),
(18,2,5000),
(19,2,5600),
(20,3,8400),
(21,1,3000),
(22,3,8400),
(23,2,6000),
(24,1,3000),
(25,3,8400)

;WITH CTE(pr_1, pr_2, RN) AS
(SELECT DISTINCT pr_1, pr_2, DENSE_RANK () OVER (PARTITION BY pr_1 ORDER BY pr_2 DESC) AS RN
FROM @test)
SELECT pr_1, pr_2 FROM CTE WHERE RN <=2 ORDER BY 1, 2 DESC

pr_1        pr_2
----------- -----------
1 3000
1 2500
2 6000
2 5600
3 8400
3 6900

(6 row(s) affected)
--__Александр__--
Дата: 20.01.2009 09:06:07
Нет, все праввильно вы придумали. Вам только осталось пронумеровать по pr_1.
Читайте про Row_Number()
Дедушка
Дата: 20.01.2009 09:07:25
Доброго дня.

Для 2005-го:
(если не нужна уникальность по pr_2)
select top (select count(distinct pr_1)+1 from #test) with ties
t.pr_1
,t.pr_2
from #test t
order by row_number() over(partition by t.pr_1 order by t.pr_2 desc)

(если всё таки нужна уникальность по pr_2)
select top (select count(distinct pr_1)+1 from #test) with ties
t.pr_1
,t.pr_2
from (select distinct pr_1, pr_2 from #test) t
order by row_number() over(partition by t.pr_1 order by t.pr_2 desc)
--------------------------------------------------------------
Дьявол кроется в деталях.
ChA
Дата: 20.01.2009 09:13:56
declare @test table (id int primary key,pr_1 int,pr_2 int)
INSERT INTO @test (id, pr_1, pr_2)
SELECT 1 , 1, 1600
UNION ALL SELECT 2, 2, 3200
UNION ALL SELECT 3, 3, 4800
UNION ALL SELECT 4, 2, 3200
UNION ALL SELECT 5, 3, 5400
UNION ALL SELECT 6, 1, 1800
UNION ALL SELECT 7, 3, 5400
UNION ALL SELECT 8, 3, 5400
UNION ALL SELECT 9, 1, 1800
UNION ALL SELECT 10, 3, 5400
UNION ALL SELECT 11, 3, 5400
UNION ALL SELECT 12, 2, 3600
UNION ALL SELECT 13, 1, 2300
UNION ALL SELECT 14, 3, 6900
UNION ALL SELECT 15, 1, 2300
UNION ALL SELECT 16, 3, 6900
UNION ALL SELECT 17, 1, 2500
UNION ALL SELECT 18, 2, 5000
UNION ALL SELECT 19, 2, 5600
UNION ALL SELECT 20, 3, 8400
UNION ALL SELECT 21, 1, 3000
UNION ALL SELECT 22, 3, 8400
UNION ALL SELECT 23, 2, 6000
UNION ALL SELECT 24, 1, 3000
UNION ALL SELECT 25, 3, 8400

SELECT
	pr_1
	, Max1
	, (
		SELECT
			MAX(t2.pr_2)
		FROM @test t2
		WHERE
			t2.pr_1 = t1.pr_1
			AND t2.pr_2 < t1.Max1
	) AS Max2
FROM (
	SELECT
		pr_1
		, MAX(pr_2) AS Max1
	FROM @test
	GROUP BY pr_1
) t1
?
rainurka
Дата: 20.01.2009 09:29:06
Спасибо большое. Помогло
iap
Дата: 20.01.2009 11:20:15
SELECT TOP 1 WITH TIES *
FROM test
ORDER BY ROW_NUMBER()OVER(PARTITION BY pr_1 ORDER BY pr_2 DESC)/3;