registro MySQL SELECIONAR imediatamente antes do intervalo e selecione gama

votos
1

Eu tenho uma tabela MySQL dos estados para três coisas, a, b e c

id  a   b   c   time
--------------------------
1   0   1   1   78
2   1   1   0   89
3   1   0   0   105
4   0   0   0   107
5   1   0   1   122
6   0   0   1   134
7   0   1   0   167
8   1   1   1   168
9   0   1   0   177
10  0   0   0   180

Como exemplo, os limites de tempo são escolhidos pelo usuário como o tempo> 100 E tempo <170

Mas eu preciso saber o valor de 'a' imediatamente antes do 1º voltou registro. (Onde ID = 2)

Estou tentando encontrar a maneira mais eficiente de criar essa consulta, sem recorrer a 2 consultas separadas.

SELECT  a, time FROM states WHERE time<100 order by time DESC limit 1
AND
SELECT  a, time FROM states WHERE time>100 AND time<170 ORDER BY time ASC

Para devolver um conjunto de resultados de ...

a   time
1   89
1   105
0   107
1   122
0   134
0   167
0   168

Qualquer conselho seria recebido com gratidão, obrigado!

Publicado 20/10/2018 em 14:09
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Um método utiliza LEAD():

SELECT  a, time
FROM (SELECT s.*, LEAD(time) OVER (ORDER BY time) as next_time
      FROM states s
     ) s
WHERE next_time > 100 AND time < 170;

Você também pode usar:

select s.*
from states s
where s.time >= (select s2.time from states s2 where s2.time <= 100 order by s2.time desc limit 1) and
      s.time < 170;

Isso, infelizmente, não funciona quando a subconsulta retorna nenhum valor. Isso pode ser corrigido, mas complica a consulta.

No entanto, sua solução é realmente bom (com union all):

(SELECT  a, time
 FROM states
 WHERE time <= 100 
 ORDER BY time DESC 
 LIMIT 1
) UNION ALL
(SELECT  a, time
 FROM states
 WHERE time > 100 AND time < 170
)
ORDER BY time ASC;

De uma perspectiva de desempenho, este deve estar bem se você tiver um índice em time. Este também lida prontamente o problema quando não há valores de 100 ou menos.

Respondeu 20/10/2018 em 14:16
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more