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:
- Разделите: 12,4 / 5 = 2,48
- Ceil: 2,48 становится 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)