Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

Обещал разместить здесь предсобеседовательную задачку   Найти похожие ветки 

 
Nikolay M. ©   (2006-03-28 14:57) [0]

По мотивам ветки
http://delphimaster.net/view/15-1142073530/

для желающих публикую задачку, точнее, две. Первая - попроще - для "студента" (условно). Вторая - на вполне взрослую вакансию.
Сразу замечу, что я просил их решить до собеседования, в спокойной домашней обстановке, а не в стрессовых условиях собеседования.

1.
Есть таблица сотрудников: ID, Name, Age. Какой sql-запрос или
пакет запросов выдаст следующий набор данных. 3 столбца:
номер строки результата запроса, возраст (сортировка по убыванию),
кол-во человек данного возраста:

№ Age Count
1 60  1
2 55  2
........
9 20  14

2.
Таблица котировок содержит в себе тикер ценной бумаги, торговую
площадку, дату и значение котировки. Необходимо написать скрипт на
T-SQL, который возвращает значение котировки для ценных бумаг EESR и LKOH,
тикер, название торговой площадки и дату котировки на каждую дату между
@StartDate и @FinishDate включительно. Если на одну дату существует
более одной котировки, приоритетной считается котировка с площадки
"MMVB". Если котировка на дату Т отсутствует, берется котировка с
максимальной датой, не превышающей Т. Если котировка за предыдущие дни
отсутствует, котировка не выдается. Предполагается, что таблица
котировок содержит в себе более миллиона записей, поэтому скрипт
должен быть оптимальным по скорости выполнения, расстановка индексов -
на усмотрение исполнителя.

DECLARE
 @StartDate  SMALLDATETIME,
 @FinishDate SMALLDATETIME

SELECT
 @StartDate  = "2005-12-29",
 @FinishDate = "2006-01-10"

IF (OBJECT_ID ("tempdb..#tRate") IS NOT NULL)
 DROP TABLE #tRate

CREATE TABLE #tRate (
 RateID         INT IDENTITY (1, 1),
 SecurityTicker VARCHAR (255),
 TradeSystem    VARCHAR (255),
 RateDate       SMALLDATETIME,
 Course         FLOAT)

INSERT INTO #tRate
 (SecurityTicker, TradeSystem, RateDate, Course)
SELECT
 "EESR", "MMVB", "2005-12-30", 1
UNION ALL
SELECT
 "EESR", "MMVB", "2006-01-03", 2
UNION ALL
SELECT
 "LKOH", "MMVB", "2006-01-02", 3
UNION ALL
SELECT
 "LKOH", "MMVB", "2006-01-04", 4
UNION ALL
SELECT
 "EESR", "RTS", "2006-01-02", 5
UNION ALL
SELECT
 "EESR", "RTS", "2006-01-03", 6
UNION ALL
SELECT
 "LKOH", "RTS", "2006-01-04", 7
UNION ALL
SELECT
 "LKOH", "RTS", "2006-01-01", 8
UNION ALL
SELECT
 "LKOH", "RTS", "2006-01-07", 9
UNION ALL
SELECT
 "LKOH", "MMVB", "2006-01-09", 10


 
Суслик ©   (2006-03-28 15:14) [1]

макс. вермя для второй задачи скажи.


 
Nikolay M. ©   (2006-03-28 15:19) [2]


> Суслик ©   (28.03.06 15:14) [1]
> макс. вермя для второй задачи скажи.


Дня 2-3 :)


 
Суслик ©   (2006-03-28 15:20) [3]

:)
выполнения, есно :)


 
Суслик ©   (2006-03-28 15:22) [4]

сам понимаешь, что задача несложная если не иметь ограничений по времени. Так что давай ограничения :)


 
Nikolay M. ©   (2006-03-28 15:24) [5]


> Суслик ©   (28.03.06 15:20) [3]

:)))

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


 
stone ©   (2006-03-28 15:33) [6]


> Nikolay M. ©


> RateDate       SMALLDATETIME,

Там просто дата или предполагает еще и время?


 
Nikolay M. ©   (2006-03-28 15:35) [7]


> Суслик ©   (28.03.06 15:22) [4]
> сам понимаешь, что задача несложная если не иметь ограничений
> по времени. Так что давай ограничения :)


Цель задачи была не выстроить кандидатов по времени работы их запросов, а посмотреть на стиль написания скриптов (с учетом требования к быстродействию).
Почти во всех решениях встречались

SELECT FROM SELECT или
SELECT FROM table JOIN (SELECT FROM) или
SELECT FROM #tRate r1 JOIN #tRate r2 ON (r1.RateDate <= r2.RateDate).

Так что о каком быстродействии тут может идти речь :(


 
stone ©   (2006-03-28 15:36) [8]

Возможна ли ситуция когда на одну дату есть котировка на один тикер, а на другой нет? Или только: или есть на оба или на оба нет?


 
Курдль ©   (2006-03-28 15:37) [9]


> Nikolay M. ©   (28.03.06 14:57)


А кто такой "тикер ценной бумаги"?


 
Nikolay M. ©   (2006-03-28 15:38) [10]


> stone ©   (28.03.06 15:33) [6]
> Там просто дата или предполагает еще и время?


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


 
stone ©   (2006-03-28 15:45) [11]


> Курдль ©   (28.03.06 15:37) [9]
>
> > Nikolay M. ©   (28.03.06 14:57)
>
>
> А кто такой "тикер ценной бумаги"?

Фиг его знает, я так понял, что это EESR и LKOH


 
jack128 ©   (2006-03-28 15:57) [12]

Курдль ©   (28.03.06 15:37) [9]
А кто такой "тикер ценной бумаги"?

Тикер - краткое наименование ценной бумаги, используемый на бирже

Nikolay M. ©   (28.03.06 14:57)
1.
Есть таблица сотрудников: ID, Name, Age. Какой sql-запрос или
пакет запросов выдаст следующий набор данных. 3 столбца:
номер строки результата запроса, возраст (сортировка по убыванию),
кол-во человек данного возраста:

А если студент скажет, что формировать номер строки на сервере - это не много бредово (о ХП молчим) - такой ответ прокатит?? :)))


 
Nikolay M. ©   (2006-03-28 15:59) [13]


> А кто такой "тикер ценной бумаги"?


Сори, запостил тот вариант, в котором нет объяснения того, что такое тикер.
По сути - краткое название ценной бумаги. EESR и LKOH - соответственно акции РАО ЕЭС и ЛУкойл.


 
Nikolay M. ©   (2006-03-28 16:02) [14]


> А если студент скажет, что формировать номер строки на сервере
> - это не много бредово (о ХП молчим) - такой ответ прокатит?
> ? :)))


Нет, не прокатит.
Во-первых, номер строки не обязательно формировать в ХП, это можно сделать и одним запросом.
Во-вторых, не вижу в этом никакой бредовости. Если бы это действительно было бредом, для этого не создавался раздел ФАК-а с 5 или 6 вариантами решения.


 
Sergey13 ©   (2006-03-28 16:03) [15]

2[7] Nikolay M. ©   (28.03.06 15:35)
> Почти во всех решениях встречались
>SELECT FROM SELECT или
>...
>Так что о каком быстродействии тут может идти речь :(

А что "SELECT FROM SELECT" и быстродействие несовместимы? Не знал.


 
Bless ©   (2006-03-28 16:10) [16]


>  Если на одну дату существует
> более одной котировки, приоритетной считается котировка
> с площадки
> "MMVB".


А что означает "приоритетной"? Выводить только эту котировку?
А если с площадки MMVB котировок нет, а есть с нескольких других площадок, то что выводить?


 
jack128 ©   (2006-03-28 16:12) [17]

Nikolay M. ©   (28.03.06 16:02) [14]
это можно сделать и одним запросом.

Я знаю, джойном.  Но имхо, это не сопостовимые по сложности задачи по сравнению с формированием на клиенте..

Nikolay M. ©   (28.03.06 16:02) [14]
Если бы это действительно было бредом, для этого не создавался раздел ФАК-а с 5 или 6 вариантами решения.

Этот фак видимо создавался для тех кхм.. не скажу кого, кто не умеет в dbgrid"е отображать данные, отличные, от тех, что выдает запрос и не знающих, что такое вычисляемые поля DataSet"а..


 
jack128 ©   (2006-03-28 16:14) [18]

jack128 ©   (28.03.06 16:12) [17]
по сложности задачи

в смысле посложности для компьютера, по быстроджействию. Сложности для программиста не то ни ддругое не представляет, конечно. Да и не программист copy|paste"ом умеет пользоваться..


 
calm ©   (2006-03-28 16:14) [19]


> А кто такой "тикер ценной бумаги"?
>


В этом вся суть теста. Это был замаскированный тест на знание предметной области :)))


 
Суслик ©   (2006-03-28 16:16) [20]

будет время, напишу.
я не силен в быстром sql, но писать иногда приходится "тяжелые" запросы. Может и получится.


 
pasha_golub ©   (2006-03-28 16:36) [21]

А какайя СУБД?


 
Суслик ©   (2006-03-28 16:37) [22]


>  [21] pasha_golub ©   (28.03.06 16:36)

mssqlserver


 
Nikolay M. ©   (2006-03-28 16:40) [23]


> jack128 ©   (28.03.06 16:12) [17]
> Я знаю, джойном.  Но имхо, это не сопостовимые по сложности
> задачи по сравнению с формированием на клиенте..


Можно несколькими способами. В любом случае я лично не вижу смысла выносить расчет номера записи на клиента.


 
DiamondShark ©   (2006-03-28 16:41) [24]


> Почти во всех решениях встречались
>
> SELECT FROM SELECT или
> SELECT FROM table JOIN (SELECT FROM) или
> SELECT FROM #tRate r1 JOIN #tRate r2 ON (r1.RateDate <=
> r2.RateDate).
>
> Так что о каком быстродействии тут может идти речь :(

И вы ещё отбором кандидатов занимаетесь?


 
Nikolay M. ©   (2006-03-28 16:42) [25]


> А что "SELECT FROM SELECT" и быстродействие несовместимы?
>  Не знал.


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


 
DiamondShark ©   (2006-03-28 16:43) [26]


> В любом случае я лично не вижу смысла выносить расчет номера
> записи на клиента.

Тяжёлый случай.
Поменяйтесь местами с каким-нибудь из своих претендентов.


 
Nikolay M. ©   (2006-03-28 16:43) [27]


> DiamondShark ©   (28.03.06 16:41) [24]
> И вы ещё отбором кандидатов занимаетесь?


Уже нет. Сотрудник найден, надеюсь, что не придется через некоторое время придумывать новую задачу - эта уже засветилась :)


 
Nikolay M. ©   (2006-03-28 16:44) [28]


> Тяжёлый случай.
> Поменяйтесь местами с каким-нибудь из своих претендентов.


???
Не понял сакрального смысла.


 
Sandman25 ©   (2006-03-28 16:46) [29]

Nikolay M. ©   (28.03.06 16:44) [28]

Сервер не должен делать то, что может делать клиент. Рисовать кнопки или генерировать номера строк НД, например.


 
Sergey13 ©   (2006-03-28 16:46) [30]

2[25] Nikolay M. ©   (28.03.06 16:42)
> Если внутренний селект возвращает несколько сотен тысяч записей, а из них потом происходит выборка по условию, будет скан всего внутреннего НД.

Если вся таблица содержит миллионы записей, то скан сотен тысяч кажется уже не таким плохим. Все зависит от конкретики, а не от конструкции запроса. ИМХО.


 
Nikolay M. ©   (2006-03-28 16:46) [31]


> Bless ©   (28.03.06 16:10) [16]
> А что означает "приоритетной"? Выводить только эту котировку?
>
> А если с площадки MMVB котировок нет, а есть с нескольких
> других площадок, то что выводить?


Если на дату есть ММВБ и что-то еще, выводится котировка ММВБ.
Если на дату ММВБ отсутствует, но есть РТС, выводится котировка РТС.


 
jack128 ©   (2006-03-28 16:48) [32]

Nikolay M. ©   (28.03.06 16:44) [28]
Дима высказал вот эту мысль
jack128 ©   (28.03.06 15:57) [12]
что формировать номер строки на сервере - это не много бредово

но в своем фирменном, добродушном стиле ;-)


 
Nikolay M. ©   (2006-03-28 16:49) [33]


> Сервер не должен делать то, что может делать клиент. Рисовать
> кнопки или генерировать номера строк НД, например.


Даже спорить не буду. Пусть это останется истиной в последней инстанции.


 
Nikolay M. ©   (2006-03-28 16:49) [34]


> jack128 ©   (28.03.06 16:48) [32]
> Дима высказал вот эту мысль


См. [33].


 
Sandman25 ©   (2006-03-28 16:54) [35]

Nikolay M. ©   (28.03.06 16:49) [33]

Пусть это останется истиной в последней инстанции.

Не истиной. В остальном можно и не спорить, конечно.


 
stone ©   (2006-03-28 16:55) [36]

У меня получился такой результат:
EESR NULL 2005-12-29 00:00:00 NULL
EESR MMVB 2005-12-30 00:00:00 1.0
EESR NULL 2005-12-31 00:00:00 1.0
EESR NULL 2006-01-01 00:00:00 1.0
EESR RTS 2006-01-02 00:00:00 5.0
EESR MMVB 2006-01-03 00:00:00 2.0
EESR NULL 2006-01-04 00:00:00 2.0
EESR NULL 2006-01-05 00:00:00 2.0
EESR NULL 2006-01-06 00:00:00 2.0
EESR NULL 2006-01-07 00:00:00 2.0
EESR NULL 2006-01-08 00:00:00 2.0
EESR NULL 2006-01-09 00:00:00 2.0
EESR NULL 2006-01-10 00:00:00 2.0
LKOH NULL 2005-12-29 00:00:00 NULL
LKOH NULL 2005-12-30 00:00:00 NULL
LKOH NULL 2005-12-31 00:00:00 NULL
LKOH RTS 2006-01-01 00:00:00 8.0
LKOH MMVB 2006-01-02 00:00:00 3.0
LKOH NULL 2006-01-03 00:00:00 3.0
LKOH MMVB 2006-01-04 00:00:00 4.0
LKOH NULL 2006-01-05 00:00:00 4.0
LKOH NULL 2006-01-06 00:00:00 4.0
LKOH RTS 2006-01-07 00:00:00 9.0
LKOH NULL 2006-01-08 00:00:00 9.0
LKOH MMVB 2006-01-09 00:00:00 10.0
LKOH NULL 2006-01-10 00:00:00 10.0


 
DiamondShark ©   (2006-03-28 16:56) [37]

Хм... Действительно, извините за стиль...
Я просто устал воевать с ветеранами фокса, несущими свой богатый опыт в к-с среду.
Чесслово, номер записи -- это ещё самое невинное.
:(


 
stone ©   (2006-03-28 16:57) [38]

Решение с коментами сюда постить или как?


 
Paul_K ©   (2006-03-28 17:04) [39]


> Nikolay M. ©   (28.03.06 16:02) [14]
>
> > А если студент скажет, что формировать номер строки на
> сервере
> > - это не много бредово (о ХП молчим) - такой ответ прокатит?
>
> > ? :)))
>
>
> Нет, не прокатит.

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


> Если на дату есть ММВБ и что-то еще, выводится котировка
> ММВБ.
> Если на дату ММВБ отсутствует, но есть РТС, выводится котировка
> РТС.

одна маленькая разница. <Тикер на ММВБ> != <Тикер на РТС>
или я опять отстал от жизни?
опять же котировка имеет смысл только в паре с площадкой. Не так ли?


 
Nikolay M. ©   (2006-03-28 17:05) [40]


> stone ©   (28.03.06 16:55) [36]
> У меня получился такой результат:
> EESR NULL 2006-01-04 00:00:00 2.0
> EESR NULL 2006-01-05 00:00:00 2.0


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



Страницы: 1 2 3 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.074 c
2-1144363672
yura32
2006-04-07 02:47
2006.04.23
Nebolshoi vopros


1-1142418502
MegaVolt
2006-03-15 13:28
2006.04.23
Как сдвинуть данные в потоке?


2-1144751826
Сергей И.
2006-04-11 14:37
2006.04.23
Помогите пожалуйста очень срочно нужно


15-1143623335
_RusLAN
2006-03-29 13:08
2006.04.23
Посоветуйте программу для рисования структуры БД (уже готовой БД)


15-1144156383
Курдль
2006-04-04 17:13
2006.04.23
Кто нибудь имеет, что сказать про QT ?