Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.015 c
2-1144320701
half_litre
2006-04-06 14:51
2006.04.23
флаг Break on exception в Delphi 7


15-1143826975
Mozart
2006-03-31 21:42
2006.04.23
посмотрел фильм the Core


15-1143882529
Marser
2006-04-01 13:08
2006.04.23
Весна...


4-1138725955
Matrex
2006-01-31 19:45
2006.04.23
Handle и PID


2-1144552946
Klopan
2006-04-09 07:22
2006.04.23
ListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский