SQL группируется по шагам

Я использую SQL в SAS.

Я делаю SQL-запрос с предложением GROUP BY для непрерывной переменной (сделанной дискретной), и я бы хотел, чтобы она агрегировала больше. Я не уверен, что это понятно, так что вот пример.

Вот мой запрос:

SELECT CEIL(travel_time) AS time_in_mn, MEAN(foo) AS mean_foo
FROM my_table
GROUP BY CEIL(travel_time)

Это даст мне среднее значение foo для каждого отдельного значения travel_time, Благодаря CEIL() функция будет группироваться по минутам, а не секундам (travel_time может принимать значения, такие как 14.7 (мин)). Но я хотел бы иметь возможность группировать по группам по 5 минут, например, чтобы у меня было что-то вроде этого:

time_in_mn  mean_foo
5           4.5
10          3.1
15          17.6
20          12

(Конечно, mean(foo) должно быть сделано в течение всего интервала, поэтому для time_in_mn = 5, mean_foo должен быть mean of foo where travel_time in (0,1,2,3,4,5))

Как я могу этого достичь?

(Извините, если ответ может быть найден легко, единственный поисковый термин, который я мог придумать, group by step, что дает мне много "пошаговых руководств" о SQL...)

1 ответ

Решение

Распространенная идиома "потолок к ступеням" (или округление, или настил, в этом отношении) состоит в том, чтобы делить на шаг, потолок (или круг, или пол, конечно), а затем умножать на него снова. Таким образом, если мы возьмем, например, 12.4:

  1. Разделите: 12,4 / 5 = 2,48
  2. Ceil: 2,48 становится 3
  3. Умножить: 3 * 5 = 15

И в форме SQL:

SELECT   5 * CEIL(travel_time / 5.0) AS time_in_mn,
         MEAN(foo) AS mean_foo
FROM     my_table
GROUP BY 5 * CEIL(travel_time / 5.0)
Другие вопросы по тегам