2014-02-14 3 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; 

получает меня неправильный результат (обратите внимание, как period1 и period2 средние баллы оценки одинаковы:

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 

Я думаю, что я не совсем понимаю, как работают окна ... У меня есть 2 вопроса:

  1. Что не так с моим запросом?
  2. Как это сделать правильно?
+0

Почему вы храните даты как строки, а не как 'DATE'? Хуже того, почему вы храните их в первый день (или месяц) и последний год? –

+0

Как мы (и SQL-Server) должны знать, является ли ''02 -06-2014'' 2 июня или 6 февраля? Вы понимаете, что если вы храните даты как строки и в этом формате, «дата» «022 -06-2014» будет считаться более поздней, чем «дата» ''01 -01-2020'', SQL- Сервер? –

ответ

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 chenqui. –

+1

@ Борат Сагдиев. Нежелателен - вопрос не имеет отношения к датам. –

+0

Большое спасибо, @ пользователь102890! – gmile

Смежные вопросы