Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Группировка с учетом граничных условий  [new]
aleks2
Guest
Minamoto
aleks2, некорректно работает, если первой записью идет выход - как в первом примере.

Я не занимаюсь фуфлом. Для того, чтоб выйти - нада войти.
31 авг 12, 13:09    [13094391]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Вообще-то подобная задача решается вообще без джойна. Просто набором сортировок таблицы.

Такой вариант на больших данных должен быть на порядки быстрее любого варианта с джойном.

select employee_id, min(case when target is not null then time end), min(case when target is null then time end)
from (
select *, row_number()over(partition by employee_id order by time)rn1,
row_number()over(partition by employee_id, sign(target) order by time)rn2
from @t
)t
group by employee_id, case when target is null then rn2-1 else rn1-rn2 end


На выложенных данных (8562 rows), залитых во времянку с индексами
SQL Server Execution Times:
CPU time = 32 ms
31 авг 12, 14:10    [13095008]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
anpv
Member

Откуда: Novosibirsk
Сообщений: 68
Anddros,

Очень интересное решение.
На 803609 строк время выборки:
SQL Server Execution Times:
CPU time = 4586 ms, elapsed time = 4819 ms.

При выборке появляется:
Warning: Null value is eliminated by an aggregate or other SET operation

Подскажите какой смысл имеет выражение:
sign(target)
31 авг 12, 17:19    [13096661]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
aleks2
Guest
Anddros
Такой вариант на больших данных должен быть на порядки быстрее любого варианта с джойном.


Это самый тормозной вариант. Лет пять назад это уже обсуждали.
Группировка означает неизбежное сканирование таблицы.
31 авг 12, 17:50    [13096863]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
aleks2
сканирование таблицы
Это что плохо?
31 авг 12, 22:24    [13097875]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
aleks2
Guest
Mnior
aleks2
сканирование таблицы
Это что плохо?

Это не плохо и не хорошо - это медленнее.
Но в некоторых случаях - неизбежно.
1 сен 12, 07:02    [13098791]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
Anddros
Member

Откуда:
Сообщений: 1077
aleks2
Mnior
пропущено...
Это что плохо?

Это не плохо и не хорошо - это медленнее.
Но в некоторых случаях - неизбежно.

Ну да, ну да...

Одно сканирование таблицы медленнее одного сканирования и туевой хучи сиков. Расскажите это кому-нить другому...
3 сен 12, 13:53    [13105408]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
Anddros
Member

Откуда:
Сообщений: 1077
anpv
Подскажите какой смысл имеет выражение:
sign(target)

В данном случае для положительных значений target (а у вас вроде бы такие) это эквивалентно выражению
case when target is not null then 1 end
. То биш для выхода - null, для входа - 1. Просто параметр для группировки -в одну группу попадают входы, в другую - выходы.
3 сен 12, 13:57    [13105436]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
aleks2
Guest
Anddros
aleks2
пропущено...

Это не плохо и не хорошо - это медленнее.
Но в некоторых случаях - неизбежно.

Ну да, ну да...

Одно сканирование таблицы медленнее одного сканирования и туевой хучи сиков. Расскажите это кому-нить другому...

Это зависит от соотношения числа диапазонов и числа записей.
Но ты могешь веровать во что тебе угодно.
3 сен 12, 14:02    [13105491]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
Anddros
Member

Откуда:
Сообщений: 1077
aleks2
Это зависит от соотношения числа диапазонов и числа записей.

Пример данных автор топика выкладывал.

Чукча не читатель?
3 сен 12, 14:14    [13105625]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
aleks2
Guest
Anddros
aleks2
Это зависит от соотношения числа диапазонов и числа записей.

Пример данных автор топика выкладывал.

Чукча не читатель?


На афторе свет клином не сошелся.

ЗЫ. Угомонись. Мне с тобой спорить нужды нету - неинтересно это.
3 сен 12, 14:23    [13105727]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
Anddros
Member

Откуда:
Сообщений: 1077
aleks
Мне с тобой спорить нужды нету - неинтересно это.
+1 :)
3 сен 12, 14:28    [13105789]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
anpv,
Если накладных расходов будет много можно поставить колонки { TargetFrom, TargetTo } тогда всё проще.
3 сен 12, 17:22    [13107428]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
anpv
Member

Откуда: Novosibirsk
Сообщений: 68
Mnior
anpv,
Если накладных расходов будет много можно поставить колонки { TargetFrom, TargetTo } тогда всё проще.


Не совсем понятен совет, можно немного подробнее.
Имеется ввиду вместо одного столбца [target] сделать 2 [TargetFrom] и [TargetTo]?
4 сен 12, 09:13    [13109559]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с учетом граничных условий  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
anpv, Угу.

Данным излишеством вы "индексируете" этот запрос.
4 сен 12, 09:27    [13109585]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить