У меня есть следующий набор данных: диапазоныСтранная функция окна поведение
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
Учитывая два времени:
02-01-2014..02-03-2014
02-04-2014..02-06-2014
Мне нужно, чтобы получить средний балл для каждого игрока в заданном временном диапазоне. Окончательный результат я пытаюсь достичь этого:
player | period_1_score | period_2_score
--------+----------------+----------------
John | 5 | 11
Mark | 4 | 10
Оригинального алгоритмом я придумал был:
- выполняет
SELECT
с двумя значениями, полученный путем разбиения набора очков на два для каждого период - над первым
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 вопроса:
- Что не так с моим запросом?
- Как это сделать правильно?
Почему вы храните даты как строки, а не как 'DATE'? Хуже того, почему вы храните их в первый день (или месяц) и последний год? –
Как мы (и SQL-Server) должны знать, является ли ''02 -06-2014'' 2 июня или 6 февраля? Вы понимаете, что если вы храните даты как строки и в этом формате, «дата» «022 -06-2014» будет считаться более поздней, чем «дата» ''01 -01-2020'', SQL- Сервер? –