확인해보십시오.
(1)
SELECT x.date, x.user_id, x.meters, x.time
FROM
MyTable x
JOIN
(
SELECT y.user_id, y.meters, min(y.time) AS time
FROM
MyTable y
GROUP BY y.user_id, y.meters
) t ON x.user_id = t.user_id AND x.time = t.time AND x.meters = t.meters
이, 나는 그것이 매우 자주 DBA가 사용되는 본 적이 어떤 종류의 패턴이다.
하지만 위의 경우 사용자 당 거리가 두 번째가 넘을 것입니다.
(사용자가 두 번 이상 가장 좋은 시간을 기록한 경우).
예를 들면 처음으로 그가
최상의 결과를 얻은 다음이 두 번째 쿼리를 시도 할 수 있습니다.
기본적으로 query (1)은 하위 쿼리로 사용됩니다.
(2)
SELECT min(m.date), m.user_id, m.meters, m.time
FROM
(
SELECT x.date, x.user_id, x.meters, x.time
FROM
MyTable x
JOIN
(
SELECT y.user_id, y.meters, min(y.time) AS time
FROM
MyTable y
GROUP BY y.user_id, y.meters
) t ON x.user_id = t.user_id AND x.time = t.time AND x.meters = t.meters
) m
GROUP BY m.user_id, m.meters, m.time
OK
, 지금은 두 쿼리를 테스트했다.
이제 두 개의 쿼리 중 하나를 사용하여 거짓말을하지 않았으므로 편안합니다.
(2)의 단순화 된 버전 (특정 사용자 용)은이 버전이됩니다.
(3)
는
SELECT min(x.date), x.user_id, x.meters, x.time
FROM
MyTable x
JOIN
(
SELECT y.user_id, y.meters, min(y.time) AS time
FROM
MyTable y
where y.user_id = 1
GROUP BY y.user_id, y.meters
) t ON x.user_id = t.user_id AND x.time = t.time AND x.meters = t.meters
GROUP BY x.user_id, x.meters, x.time
(4) 여기
는 스키마와 내가 내 쿼리를 테스트 데이터입니다. "x.meters의 =의 y.meters 및 x.time = y.time ON"
여기
create table MyTable(user_id int, season int, n int, date datetime, meters int, time int);
insert into MyTable values (1, 1, 10, '2010-01-08', 500, 10);
insert into MyTable values (1, 1, 20, '2010-01-10', 500, 10);
insert into MyTable values (1, 1, 30, '2010-01-10', 1000, 50);
insert into MyTable values (1, 1, 40, '2010-02-10', 1000, 50);
insert into MyTable values (1, 1, 50, '2010-03-10', 1000, 70);
insert into MyTable values (1, 1, 60, '2010-03-10', 5000, 20);
insert into MyTable values (1, 1, 70, '2010-04-10', 5000, 20);
insert into MyTable values (1, 1, 80, '2010-05-10', 5000, 50);
insert into MyTable values (2, 1, 90, '2010-01-10', 500, 10);
insert into MyTable values (2, 1, 100, '2010-01-08', 500, 10);
insert into MyTable values (2, 1, 110, '2010-01-11', 1000, 50);
insert into MyTable values (2, 1, 120, '2010-02-11', 1000, 50);
insert into MyTable values (2, 1, 130, '2010-03-11', 1000, 70);
insert into MyTable values (2, 1, 140, '2010-05-11', 5000, 20);
insert into MyTable values (2, 1, 150, '2010-06-11', 5000, 20);
insert into MyTable values (2, 1, 160, '2010-07-11', 5000, 50);
, 나는 x.user_id는 <> y.user_id 수 있기 때문에 당신이 여기에 문제가 잠재적으로 생각합니다. "AND x.user_id = y.user_id"또한 내 대답을 업데이트하고 테스트 데이터를 사용하며 대부분의 경우를 다루기에 충분할만큼 일반적인 데이터를 사용했습니다. 이 SQL 피들 링크가 만료되는 이유를 모르겠습니다. 나는 아직도 SQL 바이올린에 익숙하지 않다. 나는 내 쿼리에서 (3)을 사용하고 원하는 경우 표준 거리 필터를 추가한다고 말할 것이다. –
하지만 단일 user_id가있는 행만 선택할 때 user_id가 다른 이유는 무엇입니까? – Svish
y에서 내부 조인 후에 단일 사용자를 선택합니다.하지만 x에 뭐가 들었 니? x.user_id가 다르지만 그 사람이 y.user_id와 동일한 미터 및 시간을 가지고 있다고 생각하십시오. 당신은 그들과 합쳐질 것이고 당신은 x의 최소 (날짜)를 선택할 것입니다. 나는 그것을 얻지 않는다, 나에게 결함과 같게 들린다. 내 테스트 데이터에서 사용해보십시오. Btw, 나는 지금 오프라인이 될 것이다, 미안. 다시 말하지만, (3) 나는 충분히 간단하다. –