@ulelisa

Как в запросе сослаться на предыдущие строки?

Есть таблица звонков, где cid_from - звонящий, cid_to - кому звонят, duration - длительность звонка, call_time - время звонка. Нужно вывести все звонки, длительность которых больше 20 минут, а предыдущий звонок этого абонента (cid_from) меньше двух минут. Первую часть я сделать могу, но не понимаю, как сослаться на предыдущее значение абонента. Моя часть кода: SELECT * FROM calls WHERE duration>20;
Подскажите, пожалуйста, с помощью какой функции обратиться к предыдущим значениям с таким же cid_from
Таблица звонков:
spoiler
64766e99ba5b4431018733.jpeg
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
scoffs
@scoffs
Frontend | C# | Student
Возможно, вам надо что-то типа этого:
SELECT * FROM (
  -- Внутренний подзапрос, применяющий оконную функцию LAG() к таблице calls
  SELECT *,
    LAG(duration) OVER (PARTITION BY cid_from ORDER BY call_time) AS previous_duration
  FROM calls
) AS subquery
-- Основной запрос, фильтрующий результаты
WHERE duration > 20 -- Длительность звонка больше 20 минут
  AND previous_duration < 2; -- Предыдущая длительность меньше двух минут
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
petermzg
@petermzg
Самый лучший программист
Последний звонок это max(call_time), значит все последнии это:
select lst.cid_from,  lst.max(call_time) from calls lst group by lst.cid_from

а предпоследнии
select prv.cid_from,  prv.max(call_time) from calls prv
inner join (select lst.cid_from,  lst.max(call_time) mxtm from calls lst group by cid_from) tlst on tlst.cid_from = prv.cid_from
where prv.call_time < tlst.mxtm 
group by prv.cid_from
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы