programing

mysql의 다른 활동을 기반으로 행 가져오기

powerit 2023. 10. 20. 14:53
반응형

mysql의 다른 활동을 기반으로 행 가져오기

user_locations의 mysql 테이블이 하나 있습니다.아래와 같은 기록이 있습니다.

id    user_id     latitude                 longitude
 1      1         28.62584611111111        77.10560666666667
 2      1         28.62584611111111        77.10560666666667
 3      1         28.62584611111111        77.10560666666667
 4      1         28.62584611111111        77.10560666666667
 5      1         28.627457222222223       77.11092111111111
 6      1         28.627457222222223       77.11092111111111
 7      1         28.62584611111111        77.10560666666667
 8      1         28.62584611111111        77.10560666666667

자, 위도와 경도가 같은 id 1,2,3,4,7,8과 경도가 다른 id 5,6을 보십시오.

만약 내가 그룹을 만든다면 나는 단지 두개의 결과만을 얻을것입니다.하지만 제 예상 생산량은 다음과 같습니다.

 id    user_id     latitude                 longitude
 4      1         28.62584611111111        77.10560666666667
 6      1         28.627457222222223       77.11092111111111
 8      1         28.62584611111111        77.10560666666667

아래 쿼리를 시도해 보았지만 두 가지 결과를 제공합니다.

SELECT * FROM `user_locations` WHERE `user_id` = 1 Group by latitude, longitude

내가 원하는 것은 만약 계속해서 같은 위도와 경도가 발생한다면 그것은 하나의 최신 행을 반환해야 하고 그 이후에 위도와 경도의 변화가 발생한다면 그 최신 행이 올 것이고 만약 그 사이에 다시 같은 위도와 경도가 반환되어야 하는 이전 집합에서 나왔다면 그것을 반환해야 한다는 것입니다.제 문제를 이해해 주시기 바랍니다.이 문제를 해결하는 데 도움을 줄 수 있는 사람이 있습니까?

이것은 틈과 섬의 문제입니다.섬은 사용자, 위도 및 경도가 동일한 인접 행을 나타내며 각 섬의 마지막 기록을 원합니다.

여기서 가장 간단한 방법은 아마도lag()위도/longitude의 변화를 확인합니다.

select *
from (
    select ul.*,
        lag(latitude) over(partition by user_id order by id) lag_latitude,
        lag(longitude) over(partition by user_id order by id) lag_longitude
    from user_locations ul
) ul
where latitude <> lag_latitude or longitude <> lag_longitude

여기에는 MariaDB 12.2.2 이상이 필요합니다.이전 버전에서는 상관 관계가 있는 하위 쿼리를 사용하여 창 기능을 에뮬레이트할 수 있습니다.이는 많은 수의 행에서 비효율적일 수 있습니다.

select *
from user_locations ul
where latitude  <> (select ul1.latitude  from user_locations ul1 where ul1.user_id = ul.user_id and ul1.id < ul.id order by ul1.id desc limit 1)
   or longitude <> (select ul1.longitude from user_locations ul1 where ul1.user_id = ul.user_id and ul1.id < ul.id order by ul1.id desc limit 1)

언급URL : https://stackoverflow.com/questions/65254640/fetch-rows-based-on-another-activity-in-mysql

반응형