일부 설정으로 구성된 컴퓨터가 있다고 가정 해 보겠습니다. 이러한 설정은 수시로 변경되며 만료 날짜는 데이터베이스에 저장됩니다. 한 설정의 만료 날짜는 동시에 새 설정의 시작 시간입니다. 다음 표가 주어지면
id machineId expiringDate
1 1 2020-08-21 12:56:14
2 1 2020-08-21 13:43:23
3 1 2020-08-24 07:38:07
4 1 NULL
5 2 NULL
6 3 2020-08-21 11:50:39
7 3 NULL
어떻게 다음과 같은 결과로 올 수 startDate
는 IS expiringDate
기계에서 이전 항목 및 startDate
인 null
더 이전 항목이없는 경우
id machineId expiringDate startDate
1 1 2020-08-21 12:56:14 NULL
2 1 2020-08-21 13:43:23 2020-08-21 12:56:14
3 1 2020-08-24 07:38:07 2020-08-21 13:43:23
4 1 NULL 2020-08-24 07:38:07
5 2 NULL NULL
6 3 2020-08-21 11:50:39 NULL
7 3 NULL 2020-08-21 11:50:39
지금까지 전체 테이블에서 두 번째로 높은 값을 얻을 수 있었지만 모든 클래스와 모든 행에 대해 수행하는 방법에 대한 단서가 없습니다.
MySQL 버전 5.17.19
MySQL 5.7 또는 이전 버전을 사용하는 경우 여기에서 상관 하위 쿼리를 사용하여 만료 날짜의 지연을 찾을 수 있습니다.
SELECT
id,
machineId,
expiringDate,
(SELECT t2.expiringDate FROM yourTable t2
WHERE t2.machineId = t1.machineId AND t2.id < t1.id
ORDER BY t2.id DESC LIMIT 1) startDate
FROM yourTable t1
ORDER BY
machineId,
id;
id | machineId | expiringDate | startDate
---+-----------+---------------------+-------------------
1 | 1 | 2020-08-21 12:56:14 | null
2 | 1 | 2020-08-21 13:43:23 | 2020-08-21 12:56:14
3 | 1 | 2020-08-24 07:38:07 | 2020-08-21 13:43:23
4 | 1 | null | 2020-08-24 07:38:07
5 | 2 | null | null
6 | 3 | 2020-08-21 11:50:39 | null
7 | 3 | null | 2020-08-21 11:50:39
MySQL 8 이상을 사용하는 경우 LAG
분석 기능을 사용할 수 있습니다.
SELECT
id,
machineId,
expiringDate,
LAG(expiringDate) OVER (PARTITION BY machineId ORDER BY id) startDate
FROM yourTable
ORDER BY
machineId,
id;
위 쿼리의 두 버전 모두 지연이 나타나는 순서로 만료 날짜를 사용할 수 없다는 점에 유의하십시오.이 값 자체가 없을 수도 있고 NULL
순서가 없을 수도 있기 때문 입니다. 따라서 대신 id
값을 사용 하면 지연 값을 찾기 위해 여기에서 원하는 순서가 생성됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다