Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Решение тестового задания / 25 сообщений из 29, страница 1 из 2
27.10.2021, 11:54
    #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
27.10.2021, 12:15
    #40107269
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Решение тестового задания
.Евгений, я не помню, кто-то, то ли Гладченко, то ли Олонцев, что-ли, (если не они, то чур не обижаться) как то сказал что-то типа: "Если человек знает синтаксис курсора без MSDN - его к работе с SQLSERVER подпускать нельзя"
:-)))
...
Рейтинг: 0 / 0
27.10.2021, 12:53
    #40107301
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Решение тестового задания
.Евгений,

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я - яростно критикую ? Напротив, я отметил творческий подход. А решение характеризуется не одним только результатом.
...
Рейтинг: 0 / 0
27.10.2021, 14:45
    #40107397
iap
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
27.10.2021, 14:47
    #40107399
spenov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Решение тестового задания
.Евгений,
вы высказали негативную оценку претендента на работу. по крайней мере я так это понял.
я дерзнул высказать свое мнение, что для негативной оценки не достаточно информации.
вам наверное не нравится, когда чужое мнение не совпадает с вашим. для руководителя это не лучший вариант.
...
Рейтинг: 0 / 0
27.10.2021, 14:51
    #40107402
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Решение тестового задания
.Евгений
spenov,

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

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

Для больших таблиц с малым количеством повторов - это плохое решение.
...
Рейтинг: 0 / 0
27.10.2021, 14:54
    #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
27.10.2021, 15:55
    #40107448
iap
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
27.10.2021, 16:27
    #40107465
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Решение тестового задания
iap,

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

ну это вроде "а одной рукой смогёшь"? :)
Дык, сколько лет как-то обходились без SQL2005. Так что всё возможно!
...
Рейтинг: 0 / 0
27.10.2021, 17:50
    #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
27.10.2021, 18:00
    #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
27.10.2021, 18:30
    #40107513
iap
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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Решение тестового задания / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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