2013-12-15 1 views
0

표시되는 열이 * 인 기본 키를 구성하는 다음 표가 있습니다. 그들은 기본적으로 로잉 된 거리 (500, 1000 등)와 밀리 초 단위로 걸린 시간을 가진 로잉 세션입니다.각 거리에 가장 적합한 시간 찾기에 대한 쿼리

* user_id 
* season 
* n 
    date 
    meters 
    time 

특정 사용자에 대한 개인적인 베스트를 찾아야하므로 각 거리에 대한 최저 시간과 로우닝 된 날짜가 필요합니다.

나는 그것을 알아 내려고 노력했지만 모든 하위 쿼리, 가입 및 그룹화를 통해 나는 열심히 실패했습니다. 누구든지 SQL newb를 도울 수 있습니까?


최종 해결책은 대답을 기반으로합니다. 내가 어떤 사용자인지를 미리 알고 있기 때문에 조금 더 단순화하려고 노력했다. 표준 거리 만 선택하는 절도 있습니다. 내가 볼 수있는 한 멀리 일하는 것 같지만, 비린내가 보이면 저에게 알려주세요!

SELECT 
    MIN(x.date) "date", 
    x.meters, 
    x.time 
FROM session x 
INNER JOIN (SELECT 
      z.date, 
      z.meters, 
      MIN(z.time) "time" 
     FROM session z 
     WHERE z.user_id = :user_id 
      AND z.meters IN (500,1000,2000,5000,6000,10000,21097,42195,100000) 
     GROUP BY z.meters) y 
    ON x.meters = y.meters AND x.time = y.time 
GROUP BY x.meters, x.time 
+0

, 나는 x.user_id는 <> y.user_id 수 있기 때문에 당신이 여기에 문제가 잠재적으로 생각합니다. "AND x.user_id = y.user_id"또한 내 대답을 업데이트하고 테스트 데이터를 사용하며 대부분의 경우를 다루기에 충분할만큼 일반적인 데이터를 사용했습니다. 이 SQL 피들 링크가 만료되는 이유를 모르겠습니다. 나는 아직도 SQL 바이올린에 익숙하지 않다. 나는 내 쿼리에서 (3)을 사용하고 원하는 경우 표준 거리 필터를 추가한다고 말할 것이다. –

+0

하지만 단일 user_id가있는 행만 선택할 때 user_id가 다른 이유는 무엇입니까? – Svish

+1

y에서 내부 조인 후에 단일 사용자를 선택합니다.하지만 x에 뭐가 들었 니? x.user_id가 다르지만 그 사람이 y.user_id와 동일한 미터 및 시간을 가지고 있다고 생각하십시오. 당신은 그들과 합쳐질 것이고 당신은 x의 최소 (날짜)를 선택할 것입니다. 나는 그것을 얻지 않는다, 나에게 결함과 같게 들린다. 내 테스트 데이터에서 사용해보십시오. Btw, 나는 지금 오프라인이 될 것이다, 미안. 다시 말하지만, (3) 나는 충분히 간단하다. –

답변

1

확인해보십시오.

(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); 
+0

아, 날 잊어 버릴 것도 잊어 버렸어. – Svish

+0

또한 쉽지만 시간이 좀 걸립니다. –

+0

도움을 주시면 대단히 감사하겠습니다! – Svish

관련 문제