[sql] выбрать в каждой группе минимальный

yolki

есть таблица (a,b,c)
нужно сгруппировать по a, упорядочить по b и взять первый c.
типа такого:

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

результат:

a c
1 b
2 g
3 k
4 p

другими словами:
сгруппировать по a, в каждой группе выбрать минимальный b и выдать соответствующий ему c.
то же с максимальным b

hprt

бд то какая?

kill-still

в твоём случае это будет что-то вроде
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 вроде нельзя окна использовать

artimon

left join наше всё :)
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

Ve9443

T-SQL
min(b)

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)

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

Правда я надеюсь у тебя пара столбцов а и б уникальна, иначе все будет некорректно работать.

kill-still

ну так неззя же! :)
только если PK по a, b составлен

Ve9443

че нельзя? не понял

kill-still

ну сейчас у тебя они допустим уникальны, через месяц если накидают значений других, и свалится твой запрос. :)

kill-still

Сильно дорогой запрос имхо.

Ve9443

ну топикстатер не указал про уникальность, а я прдположил )
В таком случает можно чуть чуть изменить запрос, добавить min или max

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

либо так, где выведутся все минимальные значения.

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
Оставить комментарий
Имя или ник:
Комментарий: