Selecione até a linha corresponder no postgresql?
Existe uma maneira de selecionar linhas até que alguma condição seja atendida? I.e. um tipo delimit
, Mas não limitado aN
linhas, mas para todas as linhas até a primeira linha não correspondente?
Por exemplo, digamos que eu tenho a tabela:
CREATE TABLE t (id SERIAL PRIMARY KEY, rank INTEGER, value INTEGER);
INSERT INTO t (rank, value) VALUES ( 1, 1), (2, 1), (2,2),(3,1);
isso é:
test=# SELECT * FROM t;
id | rank | value
----+------+-------
1 | 1 | 1
2 | 2 | 1
3 | 2 | 2
4 | 3 | 1
(4 rows)
Desejo ordenar por classificação e selecionar até a primeira linha acima de 1.
I.e.SELECT * FROM t ORDER BY rank UNTIL value>1
e eu quero as 2 primeiras linhas de volta?
Uma solução é usar uma subconsulta ebool_or
:
SELECT * FROM
( SELECT id, rank, value, bool_and(value<2) OVER (order by rank, id) AS ok FROM t ORDER BY rank) t2
WHERE ok=true
Mas isso não acabará passando por todas as linhas, mesmo que eu queira apenas um punhado?
(contexto do mundo real: tenho eventos com registro de data e hora em uma tabela, posso usar um lead / atraso de consulta na janela para selecionar o tempo entre dois eventos, desejo todos os eventos denow
voltando desde que tenham acontecido com menos de 10 minutos de diferença - olead/lag
consulta de janela complica as coisas, exemplo tão simplificado aqui)
editar: ordenar a função de janela porrank, id