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

Откуда: Город трёх революций
Сообщений: 4666
Про само общение говорить не буду, а вот про тестовые задачи...
Прислали по почте задачи.
Одна из них (текст дословно):
Задача-1
Дано
Таблица, содержащая идентификаторы контрагентов (firm_id) и периоды договоров с каждым контрагентом
(startdate и enddate, где startdate - дата начала договора, а enddate - дата окончания договора).
Для данной таблицы реализован constraint, такой что startdate < enddate.
Единицей гранулярности времени в целях данной задачи считается день.

Требуется
Составить один запрос, который бы для данных временных границ (@begin и @end) указывал для каждого контрагента все периоды времени, такие что
1) они полностью входят в эти временные границы и
2) в их течение не действует ни один договор с данным контрагентом.

Для задачи №1 в базе нужно создать таблицу contracts.

--USE ...

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE contracts(
contract_id int IDENTITY(1,1) NOT NULL,
firm_id int NOT NULL,
startdate smalldatetime NOT NULL,
enddate smalldatetime NOT NULL,

CONSTRAINT [PK_contracts] PRIMARY KEY CLUSTERED( contract_id ASC) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE contracts ADD CONSTRAINT CK_contracts CHECK (startdate < enddate)
GO

INSERT contracts( firm_id, startdate, enddate) SELECT 1, '20060812', '20060910'
INSERT contracts( firm_id, startdate, enddate) SELECT 1, '20060304', '20060404'
INSERT contracts( firm_id, startdate, enddate) SELECT 1, '20060501', '20060910'
INSERT contracts( firm_id, startdate, enddate) SELECT 1, '20060705', '20061020'
INSERT contracts( firm_id, startdate, enddate) SELECT 2, '20060601', '20060710'
INSERT contracts( firm_id, startdate, enddate) SELECT 2, '20060812', '20060910'


моё решение:

Решение
-- Тестовые данные

if object_id('dbo.Contracts') is not null drop table dbo.Contracts

create table dbo.Contracts
(
Contract_Id         int identity(1,1) not null,
Firm_Id             int not null,
StartDate           date not null,
EndDate             date not null,
constraint [PK_Contracts] primary key clustered(Contract_Id)
)

alter table dbo.Contracts add constraint CK_Contracts check (StartDate < EndDate)
go

insert dbo.Contracts
( Firm_Id, StartDate, EndDate)
values
(1, '20060812', '20060910'),
(1, '20060304', '20060404'),
(1, '20060501', '20060910'),
(1, '20060705', '20061020'),
(2, '20060601', '20060710'),
(2, '20060812', '20060910')

select * from dbo.Contracts

--==============================================================================
--==============================================================================

-- Задача 1

declare
@begin date = '2006-04-01',
@end date = '2006-12-01'

select
Firm_Id, EndDate as StartDate, Lead_StartDate as EndDate
from
(
select
Firm_Id, StartDate,
dateadd(dd, 1, EndDate) as EndDate,
dateadd(dd, -1, lead(StartDate) over(partition by Firm_Id order by StartDate)) as Lead_StartDate
from
dbo.Contracts
) c
where
EndDate < Lead_StartDate and
EndDate between @begin and @end and
Lead_StartDate between @begin and @end
order by
Firm_Id, StartDate, EndDate


получил ответ:
не выполнено, странно, это самое интересное задание для SQL-щика, сделана только половина задания

вот сижу, смотрю на это и думаю: "толи лыжи не едут, толи..." :)
1 сен 17, 13:44    [20764497]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 823
Дедушка, вот так вот, нет?

-- Задача 1

declare
@begin date = '2006-04-01',
@end date = '2006-12-01'

select
Firm_Id, EndDate as StartDate, isnull(Lead_StartDate, @end) as EndDate
from
(
select
Firm_Id, StartDate, 
dateadd(dd, 1, EndDate) as EndDate, 
dateadd(dd, -1, lead(StartDate) over(partition by Firm_Id order by StartDate)) as Lead_StartDate
from
dbo.Contracts
) c
where
EndDate < isnull(Lead_StartDate, @end) and
EndDate between @begin and @end and
isnull(Lead_StartDate, @end) between @begin and @end
order by 
Firm_Id, StartDate, EndDate
1 сен 17, 14:16    [20764656]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 4666
Minamoto,

это первое, что приходит в голову, НО условие задачи:
"они полностью входят в эти временные границы"

граничные интервалы (полуоткрыты) т.е. если Lead_StartDate is null, то это 9999й год
1 сен 17, 14:23    [20764682]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 823
Дедушка
Minamoto,

это первое, что приходит в голову, НО условие задачи:
"они полностью входят в эти временные границы"

граничные интервалы (полуоткрыты) т.е. если Lead_StartDate is null, то это 9999й год

Ну вот вы работодателю бы это и озвучили, что у вас такое понимание задачи. Желательно это делать до того, как ее решать, потому что, если окажется, что вы неправильно поняли условие - неверное решение вместо уточнения условий может говорить не в вашу пользу.
Я вот считаю, что период "2006-09-11 - 2006-12-01" полностью входит во временные границы и в течение этого периода не действует ни один договор, попробуйте убедить меня в обратном.
1 сен 17, 14:38    [20764759]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 7631
Что будет, если задать
...
@begin date = '2006-03-01'
...
1 сен 17, 14:46    [20764790]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
DeanWinchester
Member

Откуда:
Сообщений: 113
Вот тестовые данные

INSERT contracts( firm_id, startdate, enddate) SELECT 1, '20060812', '20060910'


declare
@begin date = '2001-01-01',
@end date = '2017-01-01'



Для этих данных из условий озвученных работодателем необходимо вернуть два интервала от 2001 до 20060812 и от 20060910 до 2017-01-01

В случае Вашего решения запрос вернул 0 строк
1 сен 17, 14:59    [20764826]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 4666
Minamoto
Ну вот вы работодателю бы это и озвучили, что у вас такое понимание задачи. Желательно это делать до того, как ее решать
вы не поверите, я таки озвучил своё видение условий, правда уже после ответа, что задача не решена (ответа от них не получил),
но тут уже начинается схоластика... если вам понятна задача вы её делаете, а не пишете письма в стиле: "а я правильно понял, что..."
в контексте вашей логики каков смысл в условии 2) задачи, особенно в слове "полностью"?
Кот Матроскин
что будет, если задать
...
@begin date = '2006-03-01'
ответ не изменится с учётом "полуоткрытых граничных интервалов" и слова "полностью" условия 2 задачи

DeanWinchester
Для этих данных из условий озвученных работодателем необходимо вернуть два интервала от 2001 до 20060812 и от 20060910 до 2017-01-01
прочитайте выше по треду. с какой стати "2001 до 20060812" должно попасть в ответ если интервал на самом деле "19000101 - 20060812" и он не полностью попадает в окно запроса
1 сен 17, 15:21    [20764887]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 823
Дедушка, "полностью" - это значит, что они не пересекаются.
Я считаю, что уточнение условий задачи - это очень важная часть работы программиста - не раз встречал случаи, когда программист написал то, что он сам себе придумал, а в результате получился результат на выброс, потому что требования были не о том.
Да, в идеальном мире - идеальные требования, которые не требуют уточнений, но в реальном, к сожалению, все люди разные и по-разному могут понимать одни и те же фразы.
1 сен 17, 15:27    [20764910]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 4666
Minamoto
Дедушка, "полностью" - это значит, что они не пересекаются.
условие не пресечения нужно писать как - "интервалы не пересекаются", а если написано - "полностью", то это означает именно целиком входят.

впрочем я понимаю, что два человека могут по разному прочитать один и то же текст :)
всё это к тому, что всё это как проведение технического собеседования HRом по бумажке с ответами, если получен ответ не тот, что на бумажке значит ответ не правильный.
1 сен 17, 15:31    [20764933]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
17-77
Member

Откуда:
Сообщений: 1240
Minamoto
Я считаю, что уточнение условий задачи - это очень важная часть работы программиста - не раз встречал случаи, когда программист написал то, что он сам себе придумал, а в результате получился результат на выброс, потому что требования были не о том.
Да, в идеальном мире - идеальные требования, которые не требуют уточнений, но в реальном, к сожалению, все люди разные и по-разному могут понимать одни и те же фразы.

так то оно так, я вот например 5 раз прочитал и так и не понял условия задачи полностью
разе на 3-тьем я осознал, что надо вывести интервалы-пропуски, т.е. когда нет договоров, а на 5ом - что это надо сделать для каждого контрагента, т.е. интервалы могут повторятся

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

ну а после аналитики - решить задачу уже дело техники
но не проще сразу дать полный тестовый набор данных?
1 сен 17, 15:47    [20764982]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 823
Дедушка
Minamoto
Дедушка, "полностью" - это значит, что они не пересекаются.
условие не пресечения нужно писать как - "интервалы не пересекаются", а если написано - "полностью", то это означает именно целиком входят.

впрочем я понимаю, что два человека могут по разному прочитать один и то же текст :)
всё это к тому, что всё это как проведение технического собеседования HRом по бумажке с ответами, если получен ответ не тот, что на бумажке значит ответ не правильный.
Судя по ответу, который вы озвучили, отвечал именно тех. специалист. HR не может определить "половина" или "треть" задания выполнена. Он может только сравнить ответ с эталонным.
Так что вы просто не нашли общий язык с этим специалистом, как и со всеми, кто пришел к вам в тему, что намекает, не правда ли? ;)
Ставя себя на место такого специалиста я не вижу особой возможности отличить - разобрали ли вы оба варианта формулировки задания, и выбрали для себя один из них, или просто не поняли и неверно выполнили задание.
Если бы у меня не было возможности уточнить условия, я бы прописал комментарием в коде: "я рассмотрел условия задачи и нашел в них неопределенность. Если считать, что задание сформулировано так:..., то решение будет таким: ..., при ином варианте будет такое решение:..."
Собственно, я примерно так делал, когда недавно делал такое задание, и вроде бы мое решение приняли без доп. вопросов.
1 сен 17, 15:47    [20764987]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 823
17-77
Minamoto
Я считаю, что уточнение условий задачи - это очень важная часть работы программиста - не раз встречал случаи, когда программист написал то, что он сам себе придумал, а в результате получился результат на выброс, потому что требования были не о том.
Да, в идеальном мире - идеальные требования, которые не требуют уточнений, но в реальном, к сожалению, все люди разные и по-разному могут понимать одни и те же фразы.

так то оно так, я вот например 5 раз прочитал и так и не понял условия задачи полностью
разе на 3-тьем я осознал, что надо вывести интервалы-пропуски, т.е. когда нет договоров, а на 5ом - что это надо сделать для каждого контрагента, т.е. интервалы могут повторятся

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

ну а после аналитики - решить задачу уже дело техники
но не проще сразу дать полный тестовый набор данных?
Мы сейчас обсуждаем качество ответа - т.е. что надо было делать ТС, получив такое задание. Если говорить про само задание - да, я тоже считаю, что оно невысокого качества - можно было сделать гораздо лучше.
По сравнению с заданием, которое я недавно делал, просто небо и земля - в задании для меня была и генерация тестовых данных, и описание значимых параметров сервера, при котором будет выполняться код, и параметры оценки (хороший результат должен укладываться в 10ms).
Но, опять же, мы работаем с тем, что есть. Если вас совсем не устраивает качество задания, можно ответить отказом без попыток задание выполнить, сославшись на невысокое качество - найм - процесс двусторонний - компания оценивает вас, а вы - компанию.
1 сен 17, 15:52    [20765005]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
17-77
Member

Откуда:
Сообщений: 1240
насчет "полностью"

если есть "пустой" интервал без договоров например с 2001 по 2006 года и с 2008 по 2010, а заданный период с 2005 по 2009 то результат запроса тоже будет пустым, потому что оба "пустых" интервала попадают не полностью, а частично (у первого попадает только два из пяти, у второго только два года из трех - это не полностью)
1 сен 17, 15:53    [20765011]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 4666
Minamoto
Если бы у меня не было возможности уточнить условия, я бы прописал комментарием в коде:
"я рассмотрел условия задачи и нашел в них неопределенность. Если считать, что задание сформулировано так:..., то решение будет таким: ..., при ином варианте будет такое решение:..."
вы таки не поверите... но там были ещё задачи 8)
в одной из них нужно было написать скрипт очистки таблиц с учётом наличия форенкеев.
перед своим решением я явно написал в коментарии: "для упрощения принято, что все таблицы находятся в схеме dbo".
угадайте какой ответ получен от "тех. специалиста"?
дословная цитата
если у таблички схема НЕ dbo (например reporting) то ничего не находится и не чистится

ещё раз, я прекрасно понимаю, что работодатель волен брать тех кто ему понравился по тем или иным причинам
(и не брать если не понравился) это всё больше для тех кто будет решать задачи для Broadridge,
ну и пятница жеж, почему бы не посмеяться :)
1 сен 17, 16:12    [20765051]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Remind
Member

Откуда: UK
Сообщений: 372
DeanWinchester
Вот тестовые данные

INSERT contracts( firm_id, startdate, enddate) SELECT 1, '20060812', '20060910'


declare
@begin date = '2001-01-01',
@end date = '2017-01-01'



Для этих данных из условий озвученных работодателем необходимо вернуть два интервала от 2001 до 20060812 и от 20060910 до 2017-01-01

В случае Вашего решения запрос вернул 0 строк

Из условий, озвученных работодателем вообще не понятно что он хочет вернуть. Почему именно 2 интервала? Как по мне, так вполне четко хотят "все периоды времени", а учитывая что единицей грануляции времени в данной задаче является 1 день, то в данном случае вообще нужно вернуть овердофига периодов: [20060812; 20060813], [20060813; 20060814], [20060812; 20060814] и т.д. и т.п.
1 сен 17, 16:36    [20765162]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Remind
Member

Откуда: UK
Сообщений: 372
Не на те даты глянул, имел ввиду [20010101; 20010102], [20010102; 20010103], [200101012; 20010103] и т.д. и т.п.
1 сен 17, 16:38    [20765177]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 4666
имхо
- либо тестовая задача используется для посмотреть как человек пишет код
(форматирование, использует ли обработку ошибок и транзакции, использует ли сахар и тп. и тд.) и тогда важно именно это
- либо к задаче нужен тестовый набор что на входе, что на выходе
1 сен 17, 16:46    [20765224]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Remind
Member

Откуда: UK
Сообщений: 372
Дедушка,

В моем понимании тестовые задачи имеет смысл давать кандидатам, которые территориально находятся далеко и для того чтобы не везти в офис на очное собеседование всех подряд - как дополнительный уровень отсева. А если кандидат из Питера (в данном случае), почему бы не пригласить его в офис, выделить ему пк и дать те же самые задачи, но уже с возможностью нормально обсудить условие и решение.
1 сен 17, 17:01    [20765293]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 1643
Дедушка,

собсвенно по ответу про схему, видно что ваше решения прочитали наискосок, и не напрягали себя мыслями "а вдруг мы недостаточно однозначно определили условия задачи".
бывает
"есть два варианта ответа - мой и неправильный"(С)
1 сен 17, 18:15    [20765458]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
NewYeti
Member

Откуда: Спб
Сообщений: 27
Вот тут же из броадбриджа искали http://www.sql.ru/forum/1268213/piter-net-db-ms-sql
Может зонта и попросить прокомментировать?
2 сен 17, 10:53    [20766456]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 3919
Дедушка
Minamoto
Если бы у меня не было возможности уточнить условия, я бы прописал комментарием в коде:
"я рассмотрел условия задачи и нашел в них неопределенность. Если считать, что задание сформулировано так:..., то решение будет таким: ..., при ином варианте будет такое решение:..."
вы таки не поверите... но там были ещё задачи 8)
в одной из них нужно было написать скрипт очистки таблиц с учётом наличия форенкеев.
перед своим решением я явно написал в коментарии: "для упрощения принято, что все таблицы находятся в схеме dbo".
угадайте какой ответ получен от "тех. специалиста"?
дословная цитата
если у таблички схема НЕ dbo (например reporting) то ничего не находится и не чистится

ещё раз, я прекрасно понимаю, что работодатель волен брать тех кто ему понравился по тем или иным причинам
(и не брать если не понравился) это всё больше для тех кто будет решать задачи для Broadridge,
ну и пятница жеж, почему бы не посмеяться :)

А мне странно, что вы сделали скрипт только для dbo, тем более для всех схем не особо сложнее.

ЗЫ: насколько понимаю, у этой фирмы очень хорошая зп, могут себе позволить отбрасывать кандидатов при таких непониманиях - скорее всего тех кто понял как надо хватает, ещё из них придется выбирать.
Не огорчайтесь, вам просто не повезло.
3 сен 17, 12:08    [20767950]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
NewYeti
Member

Откуда: Спб
Сообщений: 27
Дедушка
Minamoto
Если бы у меня не было возможности уточнить условия, я бы прописал комментарием в коде:
"я рассмотрел условия задачи и нашел в них неопределенность. Если считать, что задание сформулировано так:..., то решение будет таким: ..., при ином варианте будет такое решение:..."
вы таки не поверите... но там были ещё задачи 8)
в одной из них нужно было написать скрипт очистки таблиц с учётом наличия форенкеев.
перед своим решением я явно написал в коментарии: "для упрощения принято, что все таблицы находятся в схеме dbo".
угадайте какой ответ получен от "тех. специалиста"?
дословная цитата
если у таблички схема НЕ dbo (например reporting) то ничего не находится и не чистится


Вот это, кстати, самое обидное. Я как-то имел глупость согласиться на тестовое от позитив технолоджи. Тоже некоторые моменты(3 или 4 пунта) упростил, детально описав как надо делать, если нужно более широкие возможности(более того, я о каждом варианте спросил, перед выполнением и мне ответили - делайте как считаете нужным).
Угадайте, какие претензии были в фитбеке от "тех. специалиста"(вместе с парой нормальных замечаний, честности ради)?
3 сен 17, 17:30    [20768224]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
zont55
Member

Откуда:
Сообщений: 13
NewYeti
Вот тут же из броадбриджа искали http://www.sql.ru/forum/1268213/piter-net-db-ms-sql
Может зонта и попросить прокомментировать?

Это не в мою команду, так что мне сложно сказать, кто проверял (но HR на это не заточено :) )
anyway, попробую узнать.

С первого взгляда надо еще lag для EndDate, что бы закрыть нижний полуоткрытый (от @begin) период.
не ругайте , если неправ.

В свою команду набираю только личным собеседованием.
Далеко не только технические знания важны.
4 сен 17, 14:55    [20769982]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2282
мне видится так


declare
@begin date = '2006-04-01',
@end date = '2006-12-01'
select *
from
	(select firm_id, enddate start_period, lead_startdate End_period 
	from 
		(select *, lead(startdate) over(partition by firm_id order by startdate) lead_startdate
	 from contracts) a
	 where lead_startdate > enddate -- второе условие
	 ) a
where start_period > @begin and End_period < @end -- первое условие
4 сен 17, 15:45    [20770189]     Ответить | Цитировать Сообщить модератору
 Re: Как я собеседовался в Broadrige (бывший Paladine).  [new]
zont55
Member

Откуда:
Сообщений: 13
NewYeti
Вот тут же из броадбриджа искали http://www.sql.ru/forum/1268213/piter-net-db-ms-sql
Может зонта и попросить прокомментировать?

Добрый день, коллеги.
Я узнал у своих коллег, что проверка была проста:
несколько периодов для проверки кода - output показывает, корректно ли код выполняет задание.
Если правильно - смотрится сам код :)

с первого взгляда надо еще к коду Minamoto добавить lag(EndDate) для покрытия полуоткрытого нижнего периода.
Сорри, возможно я совсем не прав (sql шашку в руки не часто беру в последнее время)
5 сен 17, 11:43    [20772108]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Работа Ответить