powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Решение тестового задания
29 сообщений из 29, показаны все 2 страниц
Решение тестового задания
    #40107261
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно соискателя (MS SQL) перед собеседованием попросили написать, как бы он удалил дубли из таблицы формата
Код: sql
1.
CREATE TABLE Client (FIO varchar(100) NULL, Address varchar(1000) NULL, Birthday date NULL, Sex varchar(1) NULL)


Его ответ был следующим:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @CURSOR cursor
set @CURSOR = cursor for
select FIO, Address, Birthday, Sex, count(*) C from Client group by FIO, Address, Birthday, Sex HAVING count(*) > 1
declare @FIO varchar(100), @Address varchar(1000), @Birthday date, @Sex varchar(1), @C int, @exec Nvarchar(max)
OPEN @CURSOR
FETCH NEXT FROM @CURSOR INTO @FIO, @Address, @Birthday, @Sex, @C
WHILE @@FETCH_STATUS = 0
BEGIN
       set @exec = 'set rowcount ' + cast(@C-1 as varchar) + '; delete from Client where '+IIF(@FIO is null,'FIO is null','FIO='''+@FIO+'''')+' and '+IIF(@Address is null,'Address is null','Address='''+@Address+'''')+' and '+IIF(@Birthday is null,'Birthday is null','Birthday='''+convert(varchar,@Birthday)+'''')+' and '+IIF(@Sex is null,'Sex is null','Sex='''+@Sex+'''')
       EXECUTE (@exec);  
FETCH NEXT FROM @CURSOR INTO @FIO, @Address, @Birthday, @Sex, @C
END
CLOSE @CURSOR
DEALLOCATE @CURSOR


Я очень уважаю творческий подход к решению задач. Но работать рядом с таким коллегой мне было бы страшно.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107269
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгений, я не помню, кто-то, то ли Гладченко, то ли Олонцев, что-ли, (если не они, то чур не обижаться) как то сказал что-то типа: "Если человек знает синтаксис курсора без MSDN - его к работе с SQLSERVER подпускать нельзя"
:-)))
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107301
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

курсор еще ладно, но я так пониаю если запись дублируется, то в итоге ни одной строчки не останется по ней
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107309
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
одна останется
cast(@C-1 as varchar)
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107312
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгений,

в 2к это вроде был единственный вариант.
если решение задачи имеет правильный результат, то это уже хорошо.
вы же не попросили озвучить все возможные варианты.
и может быть коллега наоборот продемонстрировал широту кругозора, показав столь древний вариант :)
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107321
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster, spenov,

Меня испугал не курсор, а количество примененных методов и их суммарная эффективность вместо одного из типовых, проверенных подходов.

Чтобы этот скрипт работал гарантированно, его надо, в частности, обернуть в транзакцию. А это, соответственно сказанному выше, испугало бы меня еще сильнее.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107325
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгений,

а почему в таком случае вас не пугает таблица без ключа? :)

решение по сути корректное. в определенных условиях единственное. а так можно вспомнить про обработку ошибок и еще кучу всего.
я на практике таблиц без ключа не встречал. а вопрос этот для собеседования один из самых частых. наверное традиция :)
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107344
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spenov
.Евгений,

в 2к это вроде был единственный вариант.
если решение задачи имеет правильный результат, то это уже хорошо.
вы же не попросили озвучить все возможные варианты.
и может быть коллега наоборот продемонстрировал широту кругозора, показав столь древний вариант :)


Код: sql
1.
2.
3.
select distinct * into #Client from Client;
truncate table Client;
insert Client select * from #Client;
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107348
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

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

delete top (n) автор, очевидно, не знал. Нагородил динамический запрос.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107368
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spenov,

aleks222 привел стандартное решение, наиболее простое и уместное в большинстве случаев. Он не изобретал велосипеда с треугольными колесами.

Таблицы без ключа (кучи) легальны и в некоторых ситуациях вполне обычны. Например, стейджинг (когда загружаете данные из другой системы или файла, которые требуется проверить и очистить).
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107373
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгений,

это решение простое, стандартное и уместное? однако...

а чего бы тогда не добавить ключ, удалить строки, а потом грохнуть ключ?

а если на таблице триггеры, которые еще что-то меняют?

как страшно жить :)
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107374
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spenov,

Триггеров нет, потому что об этом не сказано в задании.

Добавление уникального ключа - тоже приемлемый вариант. Несмотря на то, что данный способ потребует нескольких сортировок таблицы и прав на ее изменение, он тоже имеет право на существование.
В конце концов, если так нравится курсор, то можно им читать и им же удалять (при совпадении строки с предыдущей).
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107381
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгений,

я о том, что в задании вообще нет ничего. почему решение, которое достигает верный результат, вы так яростно критикуете? каким образом кандидат может угадать, какое решение будет по вашему мнению красивым? исходная постановка не корректна. я бы на вашем месте поинтересовался у кандидата, а знает ли он еще какие-нибудь варианты. и в каком контексте предпочтительнее использовать каждый из них.

может быть кандидат вроде алекса222 и таким образом проверил вашу адекватность :) и точно также рассказывает сейчас, что был на собеседовании. там задали тупой вопрос не имеющий к практике никакого отношения. я выдал шокирующее решение, а собеседник выпал в осадок...

по факту здесь только ваши эмоции. может вы обидели уважаемого человека :)
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107387
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spenov
.Евгений,
почему решение, которое достигает верный результат, вы так яростно критикуете?

Я - яростно критикую ? Напротив, я отметил творческий подход. А решение характеризуется не одним только результатом.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107397
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
WITH CTE(N) AS (SELECT ROW_NUMBER()OVER(PARTITION BY FIO, Address, Birthday, Sex ORDER BY 1/0) FROM Client)
DELETE CTE WHERE N>1;
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107399
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Евгений,
вы высказали негативную оценку претендента на работу. по крайней мере я так это понял.
я дерзнул высказать свое мнение, что для негативной оценки не достаточно информации.
вам наверное не нравится, когда чужое мнение не совпадает с вашим. для руководителя это не лучший вариант.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107402
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений
spenov,

aleks222 привел стандартное решение, наиболее простое и уместное в большинстве случаев. Он не изобретал велосипеда с треугольными колесами.

Таблицы без ключа (кучи) легальны и в некоторых ситуациях вполне обычны. Например, стейджинг (когда загружаете данные из другой системы или файла, которые требуется проверить и очистить).

Для больших таблиц с малым количеством повторов - это плохое решение.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107403
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
Код: sql
1.
2.
WITH CTE(N) AS (SELECT ROW_NUMBER()OVER(PARTITION BY FIO, Address, Birthday, Sex ORDER BY 1/0) FROM Client)
DELETE CTE WHERE N>1;



борьба была за нети ROW_NUMBER() в MS SQL 2000.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107448
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
iap
Код: sql
1.
2.
WITH CTE(N) AS (SELECT ROW_NUMBER()OVER(PARTITION BY FIO, Address, Birthday, Sex ORDER BY 1/0) FROM Client)
DELETE CTE WHERE N>1;




борьба была за нети ROW_NUMBER() в MS SQL 2000.
Алекс, а я пропустил версию... Что-то и сейчас не вижу. Ну да ладно!
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107465
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

ну это вроде "а одной рукой смогёшь"? :)
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107486
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
iap,

ну это вроде "а одной рукой смогёшь"? :)
Дык, сколько лет как-то обходились без SQL2005. Так что всё возможно!
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107496
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений
Недавно соискателя (MS SQL) перед собеседованием попросили написать, как бы он удалил дубли из таблицы формата
Код: sql
1.
CREATE TABLE Client (FIO varchar(100) NULL, Address varchar(1000) NULL, Birthday date NULL, Sex varchar(1) NULL)


Его ответ был следующим:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @CURSOR cursor
set @CURSOR = cursor for
select FIO, Address, Birthday, Sex, count(*) C from Client group by FIO, Address, Birthday, Sex HAVING count(*) > 1
declare @FIO varchar(100), @Address varchar(1000), @Birthday date, @Sex varchar(1), @C int, @exec Nvarchar(max)
OPEN @CURSOR
FETCH NEXT FROM @CURSOR INTO @FIO, @Address, @Birthday, @Sex, @C
WHILE @@FETCH_STATUS = 0
BEGIN
       set @exec = 'set rowcount ' + cast(@C-1 as varchar) + '; delete from Client where '+IIF(@FIO is null,'FIO is null','FIO='''+@FIO+'''')+' and '+IIF(@Address is null,'Address is null','Address='''+@Address+'''')+' and '+IIF(@Birthday is null,'Birthday is null','Birthday='''+convert(varchar,@Birthday)+'''')+' and '+IIF(@Sex is null,'Sex is null','Sex='''+@Sex+'''')
       EXECUTE (@exec);  
FETCH NEXT FROM @CURSOR INTO @FIO, @Address, @Birthday, @Sex, @C
END
CLOSE @CURSOR
DEALLOCATE @CURSOR


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


красиво сделал!
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107502
DanilaSP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap
Код: sql
1.
2.
WITH CTE(N) AS (SELECT ROW_NUMBER()OVER(PARTITION BY FIO, Address, Birthday, Sex ORDER BY 1/0) FROM Client)
DELETE CTE WHERE N>1;



Тоже нашёл такое решение. Только я не понимаю, почему оно работает. CTE что ли хранит ссылку на исходную таблицу? Что-то про это ничего в документации не сказано.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107513
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanilaSP
iap
Код: sql
1.
2.
WITH CTE(N) AS (SELECT ROW_NUMBER()OVER(PARTITION BY FIO, Address, Birthday, Sex ORDER BY 1/0) FROM Client)
DELETE CTE WHERE N>1;




Тоже нашёл такое решение. Только я не понимаю, почему оно работает. CTE что ли хранит ссылку на исходную таблицу? Что-то про это ничего в документации не сказано.
Вас не смущает, что таблицу можно апдейтить, делитить, инсертить не напрямую, а через VIEW или табличную функцию?
CTE похоже на VIEW в этом плане.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107579
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanilaSP,

что тут сложного, удалить строки, для которых вычисленное значение n > 1. Вычисляем, удаляем. Можете то же самое сделать через временную таблицу, для изучения содержимого.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107607
DanilaSP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну если это делать через временную таблицу, то всё понятно. Здесь же интересна особенность сохранения ссылок на строки исходной таблицы.
Про view посмотрел. Теперь понятно, что модификация возможна не для всех случаев, а для определённого подкласса выражений.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107683
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanilaSP,

каких ссылок? CTE - это обертка над запросом, не думайте, что сначала выполняется CTE в скобках, а потом код ниже. Перефразированный запрос, не более того. Посмотрите план запроса, будет более понятна последовательность действий.
...
Рейтинг: 0 / 0
Решение тестового задания
    #40107687
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
DanilaSP,

каких ссылок? CTE - это обертка над запросом, не думайте, что сначала выполняется CTE в скобках, а потом код ниже. Перефразированный запрос, не более того. Посмотрите план запроса, будет более понятна последовательность действий.
Кстати, CTE можно и не писать в явном виде:
Код: sql
1.
DELETE T FROM (SELECT ROW_NUMBER()OVER(PARTITION BY FIO, Address, Birthday, Sex ORDER BY 1/0) FROM Client) T(N) WHERE N>1;
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Решение тестового задания
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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