2014-07-01 6 views
2

나는SQL - 행 시퀀싱

(Jun-03-14, USA, China) 
(Jun-05-14, USA, Russia) 
(Jun-06-14, France, Germany) 
. 
. 
. 
. 
(Jun-09-14, USA, Russia) 

나는 미국이 순서대로 정확히 3 행을 수상했다 모든 인스턴스를 얻을 필요가, 다음 date_played 열, 승자, 다음과 같은 값 패자 와 테이블 놀이 일 수 있습니다.

다음 쿼리를 사용해 보았습니다.

Select 
    date, winner, loser, 
    RANK() OVER (PARTITION BY winner ORDER BY date rows 2 preceding) as rank 
from playday; 
+1

대답 SQL 엔진에 의존하고, 또한 것이다 (나는 날짜 1로 날짜를 사용) 당신은 "연속적으로"무엇을 의미하는지 명확히 정의해야합니다 - 정확하게 연속열을 정의하는 것은 무엇입니까? 고유 한 순서를 정의 할 수있는 고유 한 필드가없는 것 같습니다. – mvp

+0

시퀀스는 미국이 승자가 된 날짜입니다. SQL 엔진의 경우 postgres 또는 mySQL이 될 수 있습니다. – paddu

+0

아직 충분한 정보가 아닙니다. 당일에 2 개 이상의 연극이 있다면 어떨까요? Postgres와 MySQL 엔진은 매우 다른 기능을 가지고 있습니다. Postgres는 윈도우 함수를 지원하지만, MySQL은 그렇지 않다. – mvp

답변

1

다음 쿼리를 사용할 수 있습니다.

select winner,loser,date,cnt from (select winner, loser, date, date - lag(date,3) over (order by date) as cnt from playday) where cnt >=3 
1

처음으로 잃어버린 시간을 알아야합니다. 두 번째로 승리 횟수를 계산합니다. 마지막으로 잃어버린 날짜보다 큼 (>) 있습니다. 세 번째는 count> 3 인 경우 마지막 손실보다 큰 모든 행을 반환합니다. 죄송합니다. 죄송합니다. SQL 퍼서를 코드 앞에 올바르게 두지 마십시오.

Set @team_name = "USA"; 
select date, winner, loser 
from playday 
where (select count(*) as wins_since_loss from playday 
     where playday.winner = @team_name 
     and playday.date > 
    (select max(date) as losing_date from playday where playday.loser = @team_name)) = 3 
+0

나는이 쿼리를 당신이했던 것처럼 복잡하게 생각하지 않습니다. SQL Analytical 기능을 사용하여 수행 할 수 있습니다. – paddu

+0

내 솔루션의 주요 포인트는 단순히 카운트가 아닌 시퀀스가 ​​필요하다는 것입니다. 그러므로 이전의 2 명의 승자를 "센다"고 3 번째를 얻을 수는 없습니다. 같은 팀이 패자 열에 나타나면 결과를 확인하고 제외해야합니다. 3 승의 순서가 필요하지 않고 3 번째 승리를 계산해야하는 경우 질문에 오해의 소지가 있습니다. –

-1

쿼리는 미국 연속 3 시간을 수상 행의 순서를 당겨하는 것입니다, 이하 이상의

select date1, winner, loser from 
(
    select count (*) over (partition by change) as id, date1,winner,loser from 
    (
    select date1,winner,loser,lag_loser, sum(case when loser <> lag_loser and (loser='USA' or lag_loser='USA') then 1 else 0 end) over (order by date1 rows unbounded preceding) as change from 
    (
     select date1, winner,loser, lag(loser) over (order by date1) as lag_loser from 
     (
     select date1, winner, loser from playday 
     where winner ='USA' or loser = 'USA' 
     ORDER BY date1 ASC 
    ) 
    ) 
) 
) 
where winner ='USA' and id =3 
+0

두 sqls에서 수행 할 수있는 SQL을 복잡하게 만드는 이유는 무엇입니까? – paddu

+0

코드를 제공 할 수 있습니까? –

+0

다른 사람들이 답변을 게시했음을 알기를 바랍니다. – paddu