SQL Server: группировать даты по диапазонам
У меня есть таблица SQL с одним столбцом (dateRec), содержащая даты, формат: yyyy-mm-dd.
Есть ли способ в SQL, который я могу определить диапазоны дат, а затем группировать все элементы по этим диапазонам?
Здесь мне понадобятся следующие группы:
- group one = 0 - 7 дней
- группа 2 = 8 - 14 дней
- группа три = 15 - 30 дней
- группа четыре = 31 - 60 дней
- группа пять = отдых
Мой стандартный запрос для извлечения всех элементов из этой таблицы:
CREATE PROCEDURE [dbo].[FetchRequests]
AS
BEGIN
SET NOCOUNT ON;
SELECT subject,
dateRec,
category
FROM LogRequests
WHERE logStatus = 'active'
ORDER BY dateRec desc, subject
FOR XML PATH('items'), ELEMENTS, TYPE, ROOT('ranks')
END
Спасибо за любую помощь в этом, Тим.
Ответы
Ответ 1
Вам нужно сделать что-то вроде этого
select t.range as [score range], count(*) as [number of occurences]
from (
select case
when score between 0 and 9 then ' 0-9 '
when score between 10 and 19 then '10-19'
when score between 20 and 29 then '20-29'
...
else '90-99' end as range
from scores) t
group by t.range
Проверьте эту ссылку В SQL, как вы можете "group by" в диапазонах?
Ответ 2
Да, вы можете сделать это, добавив новый столбец, который содержит все необходимые вам группы, а затем группируется по этому столбцу:
SELECT subject,
dateRec,
category
,case when datediff(day,dateRec,Getdate())<='7' then '0 - 7 days old'
when datediff(day,dateRec,Getdate()) between '8' and '14' then '8 - 14 days old'
when datediff(day,dateRec,Getdate()) >60 then 'rest'
end Classes
into #temp1
FROM LogRequests
WHERE logStatus = 'active'
ORDER BY dateRec desc, subject
Я пропустил пару ваших диапазонов, но, надеюсь, вы получили логику
затем Группировать по этому столбцу:
select classes,
Count(*)
from #temp1
begin drop table #temp1 end
Ответ 3
WITH ranges AS (
SELECT
range_id,
ISNULL(DATEADD(day,range_start,CAST(GETDATE() AS date)),'0000-01-01') range_start,
ISNULL(DATEADD(day,range_end ,CAST(GETDATE() AS date)),'9999-12-31') range_end
FROM (VALUES
(1, -7, 0),
(2, -14, -8),
(3, -30,-15),
(4, -60,-31),
(5,NULL,-61)
) r(range_id,range_start,range_end)
)
SELECT subject,
range_id,
category
COUNT(*) AS c,
FROM LogRequests
WHERE logStatus = 'active'
INNER JOIN ranges ON dateRec BETWEEN range_start AND range_end
GROUP BY subject,category,range_id
ORDER BY range_id desc, subject