Взято с одного популярного ресурса, пока не буду спойлерить. Дано: Есть таблицы люди (person) и опросы (survey). Где в survey хранятся данные анкетирования людей на какой-то момент времени. Пусть в нём будут колонки адрес (address) и семейное положение (marriage_status). На каждого человека может приходиться любое количество записей в опроснике. Требуется: Выбрать тех людей, чей адрес или семейное положение изменилось с момента предыдущего опроса. То есть для каждого товарища надо сравнить самую свежую запись опросника с предыдущей. Не упомянутые здесь колонки, а также тип данных можете придумывать на своё усмотрение, как вам удобнее.
неясная постановка задачи: "сравненить первую и вторую записи в группе" - это выбрать N записей из каждой группы, где N = 2 "тех людей, чей адрес или семейное положение изменилось с момента предыдущего опроса" - это сравнить каждую последовательную пару опросов для каждого человека (тут, имхо, только WITH или через хранимую процедуру)
Загляни, ибо уже понятно что сам ты ничего не предложишь. --- Добавлено --- Я поправил 1 и 2 на "самую свежую" и "предыдущую". Может быть так будет понятнее.
в реализации @runcore есть один минус (кто догадается какой?), я мыслю в ином направлении но сначала работа, потом удовольствия))
Сам я придумал через Common Table Expression т.е. через "WITH", будет работать с MySQL v8 Спойлер Код (SQL): WITH cte1 AS ( SELECT MAX(n1.id) AS id, n1.person_id FROM survey AS n1 GROUP BY n1.person_id), cte2 AS ( SELECT MAX(n2.id) AS id, n2.person_id FROM survey n2 JOIN cte1 ON cte1.person_id = n2.person_id AND cte1.id > n2.id GROUP BY n2.person_id) SELECT p.*, s1.address, s2.address address2, s1.marriage_status, s2.marriage_status marriage_status2 FROM person AS p JOIN ( cte1 JOIN survey s1 ON s1.id = cte1.id ) ON cte1.person_id = p.id JOIN ( cte2 JOIN survey s2 ON s2.id = cte2.id ) ON cte2.person_id = p.id WHERE (s1.address <> s2.address) OR (s1.marriage_status <> s2.marriage_status) если решить, что "последнюю" надо искать по таймштампу, а не по айди, то будет немного другой джойн. Что-то вроде SELECT MAX(n1.dt)AS dt, n1.person_id и потом cte2 JOIN survey s2 USING(person_id, dt) https://stackoverflow.com/q/59853031/272885 там есть и другие варианты
это успешно можно заменить на CREATE temporary TABLE cte1 AS SELECT MAX(n1.id) AS id, n1.person_id ....