powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / дали задачку, не могу найти подвох.
25 сообщений из 46, страница 1 из 2
дали задачку, не могу найти подвох.
    #37537401
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дали такую вроде бы тривиальную задачу:
Напишите быстрейший запрос вывода всех сотрудников работавших в определённый
период времени.
@date_start datetime
@date_end datetime
Исходная таблица:
Table(user_id int,
date_start datetime,
date_end datetime)

Мой ответ был таким, и он неправильный.:
Код: plaintext
1.
Select user_id from table where date_start>=@date_start datetime and
date_end<=@date_end;
Скажите, где подвох? Как ее еще можно решить? Я второго варианта не вижу).
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537411
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanДали такую вроде бы тривиальную задачу:
Напишите быстрейший запрос вывода всех сотрудников работавших в определённый
период времени.
@date_start datetime
@date_end datetime
Исходная таблица:
Table(user_id int,
date_start datetime,
date_end datetime)

Мой ответ был таким, и он неправильный.:
Код: plaintext
1.
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? Оо
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537415
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanМой ответ был таким, и он неправильныйВ смысле недостаточно быстрый?
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537419
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, а зачем в запросе слово datetime?
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537428
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanДали такую вроде бы тривиальную задачу:
Напишите быстрейший запрос вывода всех сотрудников работавших в определённый
период времени.
@date_start datetime
@date_end datetime
Исходная таблица:
Table(user_id int,
date_start datetime,
date_end datetime)

Мой ответ был таким, и он неправильный.:
Код: plaintext
1.
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).
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537448
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПаганельnetivanМой ответ был таким, и он неправильныйВ смысле недостаточно быстрый?
не могу сказать.Данные только те, что я написал. Больше ничего сказать не знаю, увы.
ChA да, видимо то что надо. СПс.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537462
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при
а) @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

Код: plaintext
1.
2.
3.
4.
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

Код: plaintext
1.
2.
3.
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')
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537463
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
если проговаривать словами то: выбрать те которые начались раньше конца интервала просмотра и закончились позже начала интервала просмотра.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537469
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мне непонятно, зачем от таких запросов вообще можно требовать какую-то скорость
Вряд ли объемы данных здоровенные
И вряд ли такие запросы выполняются часто
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537471
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SomewhereSomehow,

ага, спасибо. Уже сам понял. Думаю с отрицанием или нет непринципиально , т.к. конкретных данных неизвестно.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537473
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скока пустых слофф. Когда фсе элементарно
Код: plaintext
Select user_id from table where date_start<=@date_end and date_end>=@date_start;
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537478
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanага, спасибо. Уже сам понял. Думаю с отрицанием или нет непринципиально , т.к. конкретных данных неизвестно.
самый быстрый запрос для неконкретных данных будет
Код: plaintext
select user_id =  42 
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537490
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,

кстати, рекомендую скачать (потому как наверное уже не продается) книжку "Кен Хендерсон - Профессиональное руководство Transact-SQL", там как раз разбирается именно такая задачка, подробно и с объяснениями (а так же много другой полезной инфы). Видимо, Хендерсон, был не настолько крут как наш местный чак норрис, по этому не посчитал задачу такой уж элементарной, и таки включил ее в свою книгу с подробными объяснениями.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537497
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайцев Фёдорnetivanага, спасибо. Уже сам понял. Думаю с отрицанием или нет непринципиально , т.к. конкретных данных неизвестно.
самый быстрый запрос для неконкретных данных будет
Код: plaintext
select user_id =  42 


Вы зря кушаете хлеб вашего работодателя.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537498
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SomewhereSomehownetivan,

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

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

ЗЫ. А теперь, начитавшись Кен Хендерсона, поясните чего неправильного в запросе чака норриса.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537504
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SomewhereSomehowВидимо, Хендерсон ... не посчитал задачу такой уж элементарной, и таки включил ее в свою книгу с подробными объяснениями.Задача действительно несложная, просто это тот самый случай, когда надо не только прочитать, но и правильно понять условия задачи.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537519
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2Вы зря кушаете хлеб вашего работодателя.
злой какой))
недавно уволили "ни за что"? ну поплачь, поплачь - тут все свои :-)))
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537531
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2,

Разве я сказал, что что-то неправильно? Вы все правильно написали, если обратите внимание, я тоже самое и написал чуть выше. Задача конечно несложная, когда уже знаешь в чем подвох, но раз ее дают как тесты (которые срабатывают, судя по этой ветке) и описывают в книжке - видимо и элементарной, с точки зрения новичка, тоже не назовешь.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37537740
FantomGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайцев Фёдор
Код: plaintext
1.
isnull(date_stop, '99991231 23:59:59.997')

приведет к сканированию всей таблицы
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37538179
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не думал что получится такой резонанс.Задача скорее на внимание и логику, чем на SQL)). Надо было просто нарисовать и все становится сразу ясно, а не сразу писать запрос. А книгу посмотрю, спасибо.
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37539337
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FantomGoodЗайцев Фёдор
Код: plaintext
1.
isnull(date_stop, '99991231 23:59:59.997')

приведет к сканированию всей таблицы
как и любой другой запрос. в упор не вижу индексов
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37541316
wickedru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
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

м.б. так?
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37541369
Фотография DeColo®es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2Скока пустых слофф. Когда фсе элементарно
Код: plaintext
Select user_id from table where date_start<=@date_end and date_end>=@date_start;
+1
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37541492
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, кто нить знает оптимальный индекс под такой запрос?
...
Рейтинг: 0 / 0
дали задачку, не могу найти подвох.
    #37541688
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyкстати, кто нить знает оптимальный индекс под такой запрос?Увели логин, или у меня битые ссылки памяти?

А вообще сразу вспомнил старое: 5582232, 6236024, как раз ветка с вами заканчивающая где-то здесь , и немного про индексы
Некоторые так и остались без ответа проигнорированы. Не думаю что ответят, скорее шапками закидают.
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / дали задачку, не могу найти подвох.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]