Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13750
|
Из: Москва
|
Рейтинг: 3476
|
|
[sql] выбрать в каждой группе минимальный
01.04.2011 12:55
|
|
|
есть таблица (a,b,c) нужно сгруппировать по a, упорядочить по b и взять первый c. типа такого:
code:
a b c
1 0.4 a
1 0.2 b
1 0.7 c
1 0.3 d
2 0.3 e
2 0.2 f
2 0.1 g
2 0.4 h
3 0.8 i
3 0.9 j
3 0.3 k
3 0.7 l
4 0.9 m
4 0.8 n
4 0.3 o
4 0.1 p
результат:
code:
a c
1 b
2 g
3 k
4 p
другими словами: сгруппировать по a, в каждой группе выбрать минимальный b и выдать соответствующий ему c. то же с максимальным b
Вам устное замечание. Неинформативный заголовок.
Редактировал DarkGray (03.04.2011 04:34)
|
|
blykynqp
|
sir
|
|
|
|
Рег.: 13.11.2004
|
Сообщений: 1042
|
|
Рейтинг: 724
|
|
Re: и мне посдкажите про SQL
[re: Basilio]
01.04.2011 13:08
|
|
|
|
CROTishka
|
Shai-Hulud
|
|
|
|
Рег.: 09.06.2004
|
Сообщений: 31438
|
Из: - под земли
|
Рейтинг: 3654
|
|
Re: и мне посдкажите про SQL
[re: Basilio]
01.04.2011 13:23
|
|
|
|
CROTishka
|
Shai-Hulud
|
|
|
|
Рег.: 09.06.2004
|
Сообщений: 31438
|
Из: - под земли
|
Рейтинг: 3654
|
|
Re: и мне посдкажите про SQL
[re: Basilio]
01.04.2011 13:31
|
|
|
в твоем случае это будет что-то вроде
code: SELECT a, c
FROM (SELECT ROW_NUMBER () OVER (PARTITION BY a ORDER BY b) AS r, a, c
FROM tabl) tt
WHERE r = 1
в HAVING вроде нельзя окна использовать
|
|
|
Lynn
|
'Кофеман'
|
|
|
|
Рег.: 28.02.2003
|
Сообщений: 7316
|
Из: Тропарево-Никулино
|
Рейтинг: 905
|
|
Re: и мне посдкажите про SQL
[re: Basilio]
01.04.2011 13:43
|
|
|
left join наше все 
code: sqlite> select q.a, q.c from x q left join x w on (q.a = w.a and q.b > w.b) where w.a is null;
a c
1 b
2 g
3 k
4 p
|
Плыл в небе, глубоком как сон, Кокаиновый пес - Адриан и Александр |
|
lomo
|
fynjy
|
|
|
|
Рег.: 05.04.2005
|
Сообщений: 8790
|
Из: Моск
|
Рейтинг: 989
|
|
Re: и мне посдкажите про SQL
[re: Basilio]
01.04.2011 13:46
|
|
|
T-SQL min(b)
code:
select a, (select c from #Temp e where a = t.a and b = t.b)
from (
select c.a a, min(c.b) b
from #temp c
group by c.a) t
max(b)
code:
select a, (select c from #Temp e where a = t.a and b = t.b)
from (
select c.a a, max(c.b) b
from #temp c
group by c.a) t
Правда я надеюсь у тебя пара столбцов а и б уникальна, иначе все будет некорректно работать.
|
|
CROTishka
|
Shai-Hulud
|
|
|
|
Рег.: 09.06.2004
|
Сообщений: 31438
|
Из: - под земли
|
Рейтинг: 3654
|
|
Re: и мне посдкажите про SQL
[re: lomo]
01.04.2011 14:26
|
|
|
ну так неззя же!  только если PK по a, b составлен
|
|
|
lomo
|
fynjy
|
|
|
|
Рег.: 05.04.2005
|
Сообщений: 8790
|
Из: Моск
|
Рейтинг: 989
|
|
|
|
CROTishka
|
Shai-Hulud
|
|
|
|
Рег.: 09.06.2004
|
Сообщений: 31438
|
Из: - под земли
|
Рейтинг: 3654
|
|
Re: и мне посдкажите про SQL
[re: lomo]
01.04.2011 14:36
|
|
|
ну сейчас у тебя они допустим уникальны, через месяц если накидают значений других, и свалится твой запрос. 
|
|
|
CROTishka
|
Shai-Hulud
|
|
|
|
Рег.: 09.06.2004
|
Сообщений: 31438
|
Из: - под земли
|
Рейтинг: 3654
|
|
Re: и мне посдкажите про SQL
[re: Lynn]
01.04.2011 14:39
|
|
|
Сильно дорогой запрос имхо.
|
|
|
lomo
|
fynjy
|
|
|
|
Рег.: 05.04.2005
|
Сообщений: 8790
|
Из: Моск
|
Рейтинг: 989
|
|
|
ну топикстатер не указал про уникальность, а я прдположил ) В таком случает можно чуть чуть изменить запрос, добавить min или max
code:
select a, (select min(c) from #Temp e where a = t.a and b = t.b)
from (
select c.a a, min(c.b) b
from #temp c
group by c.a) t
либо так, где выведутся все минимальные значения.
code:
select t.a, p.c
from (
select c.a a, min(c.b) b
from #temp c
group by c.a) t join #temp p on t.a= p.a and t.b = p.b
|
|