2014-02-14 10 views
2

나는 다음과 같은 데이터 세트가 있습니다이상한 윈도우 함수의 행동

player | score |  day 
--------+-------+------------ 
    John |  3 | 02-01-2014 
    John |  5 | 02-02-2014 
    John |  7 | 02-03-2014 
    John |  9 | 02-04-2014 
    John | 11 | 02-05-2014 
    John | 13 | 02-06-2014 
    Mark |  2 | 02-01-2014 
    Mark |  4 | 02-02-2014 
    Mark |  6 | 02-03-2014 
    Mark |  8 | 02-04-2014 
    Mark | 10 | 02-05-2014 
    Mark | 12 | 02-06-2014 

을 감안할 때 두 시간 범위 :

  1. 02-01-2014..02-03-2014
  2. 02-04-2014..02-06-2014

내가 평균 점수를 얻을 필요를 주어진 시간 범위 내의 각 플레이어에 대해 내가 달성하기 위해 노력하고있어 궁극적 인 결과는 이것이다 :

player | period_1_score | period_2_score 
--------+----------------+---------------- 
    John |    5 |    11 
    Mark |    4 |    10 

내가 생각 해낸 최초의 알고리즘을했다 :

  1. 가 각각 두 개로 점수의 세트를 분할하여 산출,이 개 값 SELECT을 수행 기간
  2. 첫 번째 SELECT을 초과하는 경우 플레이어 이름으로 집합을 그룹화하여 다른 것을 수행하십시오. 다음 쿼리 실행 :

내가 1 단계에 붙어

SELECT 
    player, 
    AVG(score) OVER (PARTITION BY day BETWEEN '02-01-2014' AND '02-03-2014') AS period_1, 
    AVG(score) OVER (PARTITION BY day BETWEEN '02-04-2014' AND '02-06-2014') AS period_2; 

나에게 잘못된 결과를 가져옵니다을 (period1period2 평균 점수 점수가 동일한 방법주의 :

player | period_1_score | period_2_score 
--------+----------------+---------------- 
    John |    5 |    5 
    John |    5 |    5 
    John |    5 |    5 
    John |    5 |    5 
    John |    5 |    5 
    John |    5 |    5 
    Mark |    4 |    4 
    Mark |    4 |    4 
    Mark |    4 |    4 
    Mark |    4 |    4 
    Mark |    4 |    4 
    Mark |    4 |    4 

윈도우 기능이 어떻게 작동하는지 완전히 이해하지 못한다고 생각합니다. 질문이 두 개 있습니다.

  1. 내 쿼리에 어떤 문제가 있습니까?
  2. 어떻게해야합니까?
+0

날짜를 'DATE'가 아닌 문자열로 저장하는 이유는 무엇입니까? 더 나쁜 것은, 왜 당신은 처음에 그 날 (또는 달)과 그 해를 마지막으로 보관하고있는 것입니까? –

+0

''02 -06-2014 ''가 6 월 2 일 또는 2 월 6 일 중 2 일 경우 어떻게 알 수 있습니까? 날짜를 문자열로 저장하고이 형식으로 저장하면 "02 -06-2014"의 "date"는 SQL-2005에서 "date-01-2010"보다 나중에 간주됩니다. 섬기는 사람? –

답변

2

이렇게하려면 창 기능이 필요하지 않습니다. 시도 :

select 
player 
,avg(case when day BETWEEN '02-01-2014' AND '02-03-2014' then score else null end) as period_1_score 
,avg(case when day BETWEEN '02-04-2014' AND '02-06-2014' then score else null end) as period_1_score 
from <your data> 
group by player 
+1

Yakshemash. 나는 당신이 약간 조심할 것을 제안한다 - http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx 첸기. –

+1

@BoratSagdiyev Irrelevant - 질문은 datetimes를 다루지 않습니다. –

+0

고맙습니다, @ user102890! – gmile