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

Откуда:
Сообщений: 8768
Дали такую вроде бы тривиальную задачу:
Напишите быстрейший запрос вывода всех сотрудников работавших в определённый
период времени.
@date_start datetime
@date_end datetime
Исходная таблица:
Table(user_id int,
date_start datetime,
date_end datetime)

Мой ответ был таким, и он неправильный.:
Select user_id from table where date_start>=@date_start datetime and
date_end<=@date_end;
Скажите, где подвох? Как ее еще можно решить? Я второго варианта не вижу).
21 ноя 11, 18:20    [11634076]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
netivan
Дали такую вроде бы тривиальную задачу:
Напишите быстрейший запрос вывода всех сотрудников работавших в определённый
период времени.
@date_start datetime
@date_end datetime
Исходная таблица:
Table(user_id int,
date_start datetime,
date_end datetime)

Мой ответ был таким, и он неправильный.:
Select user_id from table where date_start>=@date_start datetime and
date_end<=@date_end;
Скажите, где подвох? Как ее еще можно решить? Я второго варианта не вижу).

в результирующем наборе не уникален user_id?
date_end может быть null? и date_start?
и user_id? Оо
21 ноя 11, 18:24    [11634096]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
netivan
Мой ответ был таким, и он неправильный
В смысле недостаточно быстрый?
21 ноя 11, 18:25    [11634100]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
netivan, а зачем в запросе слово datetime?
21 ноя 11, 18:27    [11634106]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
ChA
Member

Откуда: Москва
Сообщений: 11316
netivan
Дали такую вроде бы тривиальную задачу:
Напишите быстрейший запрос вывода всех сотрудников работавших в определённый
период времени.
@date_start datetime
@date_end datetime
Исходная таблица:
Table(user_id int,
date_start datetime,
date_end datetime)

Мой ответ был таким, и он неправильный.:
Select user_id from table where date_start>=@date_start datetime and
date_end<=@date_end;
Скажите, где подвох? Как ее еще можно решить? Я второго варианта не вижу).
Вы рассмотрели случай, когда сотрудники начали и закончили работу в заданный период, но это ещё не всё. Например, date_start может быть раньше @date_start. Т.е., любая из дат (date_start, date_end) может быть между @date_start datetime и @date_end. Более того, период (@date_start, @date_end) может быть внутри периода (date_start, date_end).
21 ноя 11, 18:32    [11634125]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
netivan
Member

Откуда:
Сообщений: 8768
Паганель
netivan
Мой ответ был таким, и он неправильный
В смысле недостаточно быстрый?

не могу сказать.Данные только те, что я написал. Больше ничего сказать не знаю, увы.
ChA да, видимо то что надо. СПс.
21 ноя 11, 18:48    [11634176]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
при
а) @date_end >= @date_start
б) для всех date_start <= isnull(date_end, date_start)
в) user_id date_start - обязательные поля

есть 2 варианта
1) user_id уникален
2) уникальна пара user_id, date_start

запрос 1

select user_id
  from Table
 where date_start between @date_start and @date_end or
       @date_start between date_start and isnull(date_stop, '99991231 23:59:59.997')

запрос 2

select distinct user_id
  from Table
 where date_start between @date_start and @date_end or
       @date_start between date_start and isnull(date_stop, '99991231 23:59:59.997')
21 ноя 11, 18:55    [11634212]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
netivan,

классическая задачка по пересечению интервалов.
можно пойти от обратного, найти всех кто нас не интересует, т.е. тех кто уже закончил работать на момент datestart или тех кто начал работать после интересующей нас dateend. where date_end < @date_start or date_start_datetime > @date_enddatetime. После этого взять обратное. where not (date_end < @date_start or date_start_datetime > @date_enddatetime). Если не хочется с отрицанием, то от not можно избавиться (по правилу деморгана, если не ошибаюсь). where date_end>=@date_start and date_start_datetime <= @date_enddatetime.
если проговаривать словами то: выбрать те которые начались раньше конца интервала просмотра и закончились позже начала интервала просмотра.
21 ноя 11, 18:55    [11634216]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Что-то мне непонятно, зачем от таких запросов вообще можно требовать какую-то скорость
Вряд ли объемы данных здоровенные
И вряд ли такие запросы выполняются часто
21 ноя 11, 18:59    [11634238]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
netivan
Member

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

ага, спасибо. Уже сам понял. Думаю с отрицанием или нет непринципиально , т.к. конкретных данных неизвестно.
21 ноя 11, 19:00    [11634241]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
aleks2
Guest
Скока пустых слофф. Когда фсе элементарно
Select user_id from table where date_start<=@date_end and date_end>=@date_start;
21 ноя 11, 19:01    [11634248]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
netivan
ага, спасибо. Уже сам понял. Думаю с отрицанием или нет непринципиально , т.к. конкретных данных неизвестно.

самый быстрый запрос для неконкретных данных будет
select user_id = 42
21 ноя 11, 19:04    [11634266]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
netivan,

кстати, рекомендую скачать (потому как наверное уже не продается) книжку "Кен Хендерсон - Профессиональное руководство Transact-SQL", там как раз разбирается именно такая задачка, подробно и с объяснениями (а так же много другой полезной инфы). Видимо, Хендерсон, был не настолько крут как наш местный чак норрис, по этому не посчитал задачу такой уж элементарной, и таки включил ее в свою книгу с подробными объяснениями.
21 ноя 11, 19:10    [11634293]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
aleks2
Guest
Зайцев Фёдор
netivan
ага, спасибо. Уже сам понял. Думаю с отрицанием или нет непринципиально , т.к. конкретных данных неизвестно.

самый быстрый запрос для неконкретных данных будет
select user_id = 42


Вы зря кушаете хлеб вашего работодателя.
21 ноя 11, 19:15    [11634310]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
aleks2
Guest
SomewhereSomehow
netivan,

кстати, рекомендую скачать (потому как наверное уже не продается) книжку "Кен Хендерсон - Профессиональное руководство Transact-SQL", там как раз разбирается именно такая задачка, подробно и с объяснениями (а так же много другой полезной инфы). Видимо, Хендерсон, был не настолько крут как наш местный чак норрис, по этому не посчитал задачу такой уж элементарной, и таки включил ее в свою книгу с подробными объяснениями.


Что поделать? Дураков на свете больше, чем умных. Следовательно, нада рассчитывать на дураков.

ЗЫ. А теперь, начитавшись Кен Хендерсона, поясните чего неправильного в запросе чака норриса.
21 ноя 11, 19:19    [11634319]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
ChA
Member

Откуда: Москва
Сообщений: 11316
SomewhereSomehow
Видимо, Хендерсон ... не посчитал задачу такой уж элементарной, и таки включил ее в свою книгу с подробными объяснениями.
Задача действительно несложная, просто это тот самый случай, когда надо не только прочитать, но и правильно понять условия задачи.
21 ноя 11, 19:21    [11634336]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
aleks2
Вы зря кушаете хлеб вашего работодателя.

злой какой))
недавно уволили "ни за что"? ну поплачь, поплачь - тут все свои :-)))
21 ноя 11, 19:35    [11634385]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
aleks2,

Разве я сказал, что что-то неправильно? Вы все правильно написали, если обратите внимание, я тоже самое и написал чуть выше. Задача конечно несложная, когда уже знаешь в чем подвох, но раз ее дают как тесты (которые срабатывают, судя по этой ветке) и описывают в книжке - видимо и элементарной, с точки зрения новичка, тоже не назовешь.
21 ноя 11, 19:41    [11634405]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
FantomGood
Member

Откуда: Херсон
Сообщений: 340
Зайцев Фёдор
isnull(date_stop, '99991231 23:59:59.997')

приведет к сканированию всей таблицы
21 ноя 11, 23:06    [11635123]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
netivan
Member

Откуда:
Сообщений: 8768
Не думал что получится такой резонанс.Задача скорее на внимание и логику, чем на SQL)). Надо было просто нарисовать и все становится сразу ясно, а не сразу писать запрос. А книгу посмотрю, спасибо.
22 ноя 11, 11:14    [11636237]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
FantomGood
Зайцев Фёдор
isnull(date_stop, '99991231 23:59:59.997')

приведет к сканированию всей таблицы

как и любой другой запрос. в упор не вижу индексов
22 ноя 11, 21:00    [11640749]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
wickedru
Member

Откуда: СПб
Сообщений: 52
SELECT user_id
FROM table
WHERE date_start BETWEEN @date_start AND @date_end
OR date_end BETWEEN @date_start AND @date_end
OR @date_start BETWEEN date_start AND date_end
OR @date_end BETWEEN date_start AND date_end

м.б. так?
23 ноя 11, 19:30    [11647890]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
aleks2
Скока пустых слофф. Когда фсе элементарно
Select user_id from table where date_start<=@date_end and date_end>=@date_start;
+1
23 ноя 11, 20:08    [11648015]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
кстати, кто нить знает оптимальный индекс под такой запрос?
23 ноя 11, 22:05    [11648377]     Ответить | Цитировать Сообщить модератору
 Re: дали задачку, не могу найти подвох.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
locky
кстати, кто нить знает оптимальный индекс под такой запрос?
Увели логин, или у меня битые ссылки памяти?

А вообще сразу вспомнил старое: 5582232, 6236024, как раз ветка с вами заканчивающая где-то здесь, и немного про индексы
Некоторые так и остались без ответа проигнорированы. Не думаю что ответят, скорее шапками закидают.
24 ноя 11, 02:30    [11649175]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить