Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подсчет числа непрерывных диапазонов внутри интервала  [new]
rte
Member

Откуда:
Сообщений: 293
Привет.
Есть данные след. вида
ID Date        Value
1 20140210  0
1 20140211  100
1 20140212  0
1 20140213 150
1 20140214 120
1 20140215 0
2 20140210  1500
2 20140211  1200
2 20140212  100
2 20140213  120
2 20140214  80
2 20140215  190


Нужно выводить данные за дипазон от Дата1 до Дата 2 в виде
ID Num

где Num - число "непрерывных" интервалов с ненулевыми значениями, т.е. для данного примера
ID Num
1  2
2  1 

Однако, не соображу - как это сделать В SQL без курсоров?
Спасибо :-)
14 фев 14, 15:12    [15568623]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
Добрый Э - Эх
Guest
искать темы с моим участием по ключевым словам: "инвариант группы" , "разность двух разнооконных row_number-ов", "start_of_group", "grp_id"
14 фев 14, 15:16    [15568661]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
aleks2
Guest
Добрый Э - Эх
искать темы с моим участием по ключевым словам: "инвариант группы" , "разность двух разнооконных row_number-ов", "start_of_group", "grp_id"

Не надо это искать.
Это говноалгоритмы, нагружающие мозг и сервер.

Достаточно выкинуть 0-и и посчитать число разрывов непрерывности.
14 фев 14, 15:24    [15568733]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Кстати, а чегой-то нули-то выкинули?
Чем это не "непрерывный интервал"?

А вообще, версия сервера неизвестна.
Может, это MSSQL 6.5?
14 фев 14, 15:27    [15568760]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
Добрый Э - Эх
Guest
aleks2,

когда мозга нет, то и нагружать нечего.
так что - не беспокойся...
но на досуге можешь и промежности посчитать, раз оно тебе так нравится...
14 фев 14, 15:30    [15568788]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
with x as
(
 select
  *, datediff(day, '1900', [Date]) - row_number() over (partition by ID order by [Date]) as g
 from
  [Есть данные след. вида]
 where
  Value <> 0
)
select
 ID, count(distinct g)
from
 x
group by
 ID;
14 фев 14, 15:31    [15568796]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
Добрый Э - Эх
Guest
iap
Кстати, а чегой-то нули-то выкинули?
Чем это не "непрерывный интервал"?
нули человека не интересуют. это в постановке задачи озвучено:
rte
где Num - число "непрерывных" интервалов с ненулевыми значениями
14 фев 14, 15:31    [15568802]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
Добрый Э - Эх
Guest
invm,

"Это говноалгоритмы, нагружающие мозг и сервер" (с) aleks2
14 фев 14, 15:33    [15568823]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Добрый Э - Эх
invm,

"Это говноалгоритмы, нагружающие мозг и сервер" (с) aleks2
К тому же для 6-й версии не отработает!
Там NOT EXISTS() писать надо!
14 фев 14, 15:38    [15568877]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
aleks2
Guest
select ID, count(*) from [Есть данные след. вида] t
  where Value <> 0 
     and not exists( select * from [Есть данные след. вида] tt where tt.Value <> 0 and tt.Date = t.Date+1)
  group by ID
14 фев 14, 15:39    [15568885]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
Добрый Э - Эх
Guest
iap
К тому же для 6-й версии не отработает!
Там NOT EXISTS() писать надо!

так-то на древних версиях сервера всегда заменял not exists на left join + where ... is null.
Но сейчас понимаю, что есть люди, для которых может оказаться что "Это говноалгоритмы, нагружающие мозг."
14 фев 14, 15:42    [15568903]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Добрый Э - Эх
так-то на древних версиях сервера всегда заменял not exists на left join + where ... is null
Я когда-то тоже так заблуждался. 10704622
Из недавнего: 12443133
16 фев 14, 08:26    [15573236]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
rte
Member

Откуда:
Сообщений: 293
aleks2
select ID, count(*) from [Есть данные след. вида] t
  where Value <> 0 
     and not exists( select * from [Есть данные след. вида] tt where tt.Value <> 0 and tt.Date = t.Date+1)
  group by ID


Большое спасибо. Добавил join по ID.
Отличная идея,все работает.
17 фев 14, 12:00    [15576213]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
aleks2
Guest
rte
Отличная идея

Осподе милосердный! Чему нонича в ясельках то учат?
17 фев 14, 12:12    [15576288]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
aleks2
tt.Date = t.Date+1)

учитывая что Date ето datetime - то можно потом будет долго удивляться ;)
17 фев 14, 12:59    [15576672]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Maxx
aleks2
tt.Date = t.Date+1)


учитывая что Date ето datetime - то можно потом будет долго удивляться ;)
А если это DATE, то единицу так не прибавишь :))
17 фев 14, 13:58    [15577066]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет числа непрерывных диапазонов внутри интервала  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
aleks2
tt.Date = t.Date+1)
+ +22
17 фев 14, 19:00    [15579152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить