Problem z uzyskaniem wartości z tabeli (zadanie z windą) w SQL

0

Hej wszystkim :) Mam pewien problem z jednym zadań a mianowicie:

mam tabelkę "Lista"

ID | Imię | waga | kolejność

6 | Jan | 85 | 4
4 | Maria | 55 | 2
1 | Piotr | 80 | 5
3 | Paweł | 75 | 6
5 | Wiktor | 80 | 1
2 | Aneta | 65 | 3

Lista przedstawia ludzi czekających w kolejce do wejścia do windy wg pozycji w kolumnie kolejność. Winda może pomieścić ludzi o łącznej wadze 200kg. Wynikiem zapytania powinno być imię osoby która jako ostatnia może wejść do windy czyli w tym wypadku Aneta. Jak to zrobić ? Moim zdaniem nie da się bez pętli i instrukcji warunkowej...

0

Tak na szybko - nie wiem czy dobrze, ale generalnie idea jest taka, żeby zrobić join sam ze sobą, aby mieć listy potencjalnych grup ludzi

create table people(name varchar(10), weight int, sequence int);
insert into people value ('Wiktor',  80 , 1), ('Maria',  55 , 2), ( 'Aneta',  65 , 3), ( 'Jan',  85 , 4), ( 'Piotr',  80 , 5), ('Paweł',  75 , 6);

select p1.name, sum(p2.weight) from people p1 join people p2 
where p1.sequence >= p2.sequence group by p1.name, p1.sequence 
having sum(p2.weight) <= 200 
order by sum(p2.weight) desc
limit 1;

Brakuje sortowania po kolejności i być może trzeba pozbyć się 'limit' i użyć selecta zagnieżdżonego żeby wyciągnąć imię dla max wartości - ale mam nadzieję że to cię nakieruje :)

2

Bez jooin i z funkcją okienkową:

select 
	name
from (select 
		*
		, sum(weight) over (order by sequence) sw 
	from 
		people) t
where 
	sw <= 200
order by
	sequence desc
limit 1

https://dbfiddle.uk/?rdbms=postgres_8.4&fiddle=cb21976d2f2c99f6829e033dbb81e8f1

1 użytkowników online, w tym zalogowanych: 0, gości: 1