Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка по годам  [new]
Иван Крамер
Guest
Есть начальная и конечная дата, надо на основе них сделать таблицу с годами, которые содержатся между этими датами. Т.е.
BeginDate = 01.01.2007
EndDate = 06.05.2009

Надо получить таблицу

2007
2008
2009


Что-то мозг не варит как это сделать???
15 окт 09, 14:41    [7791454]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Самое простое -это таблица вспомогательная с списком дат(годов) и объеденять с ней запрос ваш
15 окт 09, 14:49    [7791521]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Иван Крамер,

лучше всего сделать постоянную таблицу и заполнить её в цикле датами от, например, '19900101' до, например, '20201231' с шагом 1 день.
Многие задачи будут решаться с полоборота!
И эта тоже
15 окт 09, 14:51    [7791533]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
declare @dt1 datetime, @dt2 datetime
select @dt1='20070101', @dt2='20090506'

select number from master..spt_values
where type='P' 
and number between datepart(year, @dt1) and datepart(year, @dt2)
15 окт 09, 14:52    [7791542]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
Иван Крамер
Guest
Обошелся простым циклом по заполнению временной таблици.
15 окт 09, 14:55    [7791563]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Иван Крамер
Обошелся простым циклом по заполнению временной таблици.
Можно и без таблиц, подзапросами (в 2005/2008 ещё и CTE).
Но со временем надоест одно и то же. Почему бы не сделать один раз, - и забыть?
15 окт 09, 14:58    [7791584]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
iap
Иван Крамер
Обошелся простым циклом по заполнению временной таблици.
Можно и без таблиц, подзапросами (в 2005/2008 ещё и CTE).
Но со временем надоест одно и то же. Почему бы не сделать один раз, - и забыть?

CTE тормозит на больших объемах
мне приходилось генерировать более миллиона записей. плюнул на CTE, сделал таблицу по 100К и заплонял циклом. летает.
16 окт 09, 01:22    [7794411]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
iljy
Member

Откуда:
Сообщений: 8711
AAron,


а вы использовали рекурсивный CTE? Тогда конечно тормозит:) Попробуйте так
with L0 as (select 0 x union all select 0),
       L1 as (select 0 x from L0 t1, L0 t2),
       L2 as (select 0 x from L1 t1, L1 t2),
       L3 as (select 0 x from L2 t1, L2 t2),
       L4 as (select 0 x from L3 t1, L3 t2),
       L5 as (select row_number() over(order by t1.x) N from L4 t1, L4 t2)
select top 1000000 * from L5
16 окт 09, 01:34    [7794421]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
прикольная вариация старого варианты с перемножением множеств
но с таблицей реально проще решение множества задач.
16 окт 09, 02:08    [7794446]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
Crimean
Member

Откуда:
Сообщений: 13148
задача разовая или постоянная?
если разовая то select distinct year( date )
если постоянная то надо поддерживать табличку с датами, дабы избежать массовых сканов
индексом тут не обойтись :) ну разве что поле year сделать и индекс по нему, но я за табличку сбоку
16 окт 09, 10:21    [7795038]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по годам  [new]
iljy
Member

Откуда:
Сообщений: 8711
AAron,

проще конечно, но если задача редкая или разовая - места под счетчик может быть жалко.Такой вариант дает 2^32, соответствующая таблица 16Гб
16 окт 09, 12:09    [7795922]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить