#sql #group-by #oracle-sqldeveloper
#sql #группировать по #oracle-sqldeveloper
Вопрос:
Может кто-нибудь помочь мне разобраться в группировке по диапазону дат??
Прямо сейчас у меня есть запрос, подобный этому
Select date, count(x)
from data
group by date
Это возвращает результаты, которые выглядят следующим образом
2011/1/1 10
2011/1/2 5
2011/1/3 8
2011/1/4 3
и т.д…
Но я хотел бы считать каждые 2 дня, чтобы данные выглядели так
2011/1/1 15
2011/1/3 11
Есть идеи??
Спасибо
Комментарии:
1. Как вы определяете, какие два дня идут вместе? Почему, например, 1/1 и 1/2, а не 1/2 и 1/3?
Ответ №1:
Вы можете нормализовать даты в группы по 2, преобразовав их в числовое целое значение и сократив до четных чисел. Простой способ сделать это val / 2 * 2
, потому что первый / 2
будет усечен из любых десятичных знаков (при условии, что тип val
является целым числом!), И * 2
вернет его к исходному значению, за исключением нормализованного до четного числа. Вот пример, который нормализует и группирует результаты с использованием источника данных CTE:
;with Data as (
select '1/1/2011' as [date], 1 as x union
select '1/1/2011' as [date], 2 as x union
select '1/1/2011' as [date], 3 as x union
select '1/1/2011' as [date], 4 as x union
select '1/1/2011' as [date], 5 as x union
select '1/1/2011' as [date], 6 as x union
select '1/1/2011' as [date], 7 as x union
select '1/1/2011' as [date], 8 as x union
select '1/1/2011' as [date], 9 as x union
select '1/1/2011' as [date], 10 as x union
select '1/2/2011' as [date], 11 as x union
select '1/2/2011' as [date], 12 as x union
select '1/2/2011' as [date], 13 as x union
select '1/2/2011' as [date], 14 as x union
select '1/2/2011' as [date], 15 as x union
select '1/3/2011' as [date], 16 as x union
select '1/3/2011' as [date], 17 as x union
select '1/3/2011' as [date], 18 as x union
select '1/3/2011' as [date], 19 as x union
select '1/3/2011' as [date], 20 as x union
select '1/3/2011' as [date], 21 as x union
select '1/3/2011' as [date], 22 as x union
select '1/3/2011' as [date], 23 as x union
select '1/4/2011' as [date], 24 as x union
select '1/4/2011' as [date], 25 as x union
select '1/4/2011' as [date], 26 as x
)
Select
cast(cast(cast(Date as datetime) as integer) / 2 * 2 as datetime) as date,
count(x)
from data
group by cast(cast(Date as datetime) as integer) / 2 * 2
Вывод:
date (No column name)
2011-01-01 00:00:00.000 15
2011-01-03 00:00:00.000 11
Ответ №2:
Select floor((date - trunc(date,'MM')) / 2), count(x)
from data
group by floor((date - trunc(date,'MM')) / 2)