powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сертификация и обучение [игнор отключен] [закрыт для гостей] / Тесты по Transact-SQL на интервью для пиема на работу
19 сообщений из 19, страница 1 из 1
Тесты по Transact-SQL на интервью для пиема на работу
    #36153505
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Условия решения:
- нельзя использовать cursor-ы и цикл while;
- можно использовать temporary tables в неограниченном количестве.

Тест 1.
-----------
Дается таблица "create table a (userid int,date0 datetime)".
Запрос "select * from a" приносит результат:
userid date0
----------- -----------------------
300 2009-08-19 17:38:11.790
300 2009-08-19 17:38:11.790
300 2009-08-19 17:38:11.790
300 2009-08-19 17:38:11.790
300 2009-08-19 17:38:11.790
302 2009-08-19 17:38:11.790
302 2009-08-19 17:38:11.790
302 2009-08-19 17:38:11.790
303 2009-08-19 17:38:11.790
303 2009-08-19 17:38:11.790

Надо пронумеровать записи врутри каждого значения поля "userid", т.е. добиться следующего результата:
userid date0 id-num
--------- ---------------------------- -----------
300 2009-08-19 17:38:11.790 1
300 2009-08-19 17:38:11.790 2
300 2009-08-19 17:38:11.790 3
300 2009-08-19 17:38:11.790 4
300 2009-08-19 17:38:11.790 5
302 2009-08-19 17:38:11.790 1
302 2009-08-19 17:38:11.790 2
302 2009-08-19 17:38:11.790 3
303 2009-08-19 17:38:11.790 1
303 2009-08-19 17:38:11.790 2


Тест 2.
---------
Дается таблица "create table b (userid int,date2 datetime,count2 int )".
Запрос "select * from b" приносит результат:
userid date2 count2
--------- ------------------------- -----------
300 2009-01-01 18:08:41.270 5
300 2009-01-02 18:08:41.270 6
300 2009-01-09 18:08:41.270 45
300 2009-01-10 18:08:41.270 35
302 2009-01-17 18:08:41.270 50
302 2009-01-18 18:08:41.270 8
302 2009-01-03 18:08:41.270 84
302 2009-01-05 18:08:41.270 24

Надо просуммировать значения поля "count2" для каждого 8-ми дневного периода, исходя из значений поля "period", внутри каждого значения поля "userid" в предложенной ниже форме, т.е. добиться следующего результата:
userid period count2
--------- ------------------------- -----------
300 2009-01-01 - 2009-01-08 11
300 2009-01-09 - 2009-01-16 80
302 2009-01-01 - 2009-01-08 108
302 2009-01-16 - 2009-01-25 58

Примечание: для примера я взял только два значения поля "userid" для трех первых 8-ми дневных периодов года, а в задание имелось в виду неограниченное количество значений поля "userid" для всех 8-ми дневных периодов года.


Прошу уважаемых коллег предлагать свои решения вышеуказанных тестов.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36153522
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку при переносе модератором формат исходного текста изменился, я привожу текст в исходном, на мой взгляд, более понятном для прочтения формате.

Условия решения:
- нельзя использовать cursor-ы и цикл while;
- можно использовать temporary tables в неограниченном количестве.

Тест 1.
-----------
Дается таблица "create table a (userid int,date0 datetime)".
Запрос "select * from a" приносит результат:
userid date0
----------- -----------------------
300 2009-08-19 17:38:11.790
300 2009-08-19 17:38:11.790
300 2009-08-19 17:38:11.790
300 2009-08-19 17:38:11.790
300 2009-08-19 17:38:11.790
302 2009-08-19 17:38:11.790
302 2009-08-19 17:38:11.790
302 2009-08-19 17:38:11.790
303 2009-08-19 17:38:11.790
303 2009-08-19 17:38:11.790

Надо пронумеровать записи внутри каждого значения поля "userid", т.е. добиться следующего результата:
userid date0 id-num
--------- ---------------------------- -----------
300 2009-08-19 17:38:11.790 1
300 2009-08-19 17:38:11.790 2
300 2009-08-19 17:38:11.790 3
300 2009-08-19 17:38:11.790 4
300 2009-08-19 17:38:11.790 5
302 2009-08-19 17:38:11.790 1
302 2009-08-19 17:38:11.790 2
302 2009-08-19 17:38:11.790 3
303 2009-08-19 17:38:11.790 1
303 2009-08-19 17:38:11.790 2


Тест 2.
---------
Дается таблица "create table b (userid int,date2 datetime,count2 int )".
Запрос "select * from b" приносит результат:
userid date2 count2
--------- ------------------------- -----------
300 2009-01-01 18:08:41.270 5
300 2009-01-02 18:08:41.270 6
300 2009-01-09 18:08:41.270 45
300 2009-01-10 18:08:41.270 35
302 2009-01-17 18:08:41.270 50
302 2009-01-18 18:08:41.270 8
302 2009-01-03 18:08:41.270 84
302 2009-01-05 18:08:41.270 24

Надо просуммировать значения поля "count2" для каждого 8-ми дневного периода, исходя из значений поля "period", внутри каждого значения поля "userid" в предложенной ниже форме, т.е. добиться следующего результата:
userid period count2
--------- ------------------------- -----------
300 2009-01-01 - 2009-01-08 11
300 2009-01-09 - 2009-01-16 80
302 2009-01-01 - 2009-01-08 108
302 2009-01-16 - 2009-01-25 58

Примечание: для примера я взял только два значения поля "userid" для трех первых 8-ми дневных периодов года, а в задание имелось в виду неограниченное количество значений поля "userid" для всех 8-ми дневных периодов года.


Прошу уважаемых коллег предлагать свои решения вышеуказанных тестов.
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36153674
--__Александр__--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лимон
А зачем? Задачи то элементарные.
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36155176
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--__Александр__--,

Я первую не знаю пока как решить, а вторую решил чересчур громоздко, используя 4 temporary tables, поэтому надеюсь увидеть решения коллег.

Вот Вы, например, знаете как решить эти элементарнне задачи, поэтому я прошу Вас написать Ваши решения здесь.
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36156406
bs600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лимон,

Тест 1
Код: plaintext
1.
2.
3.
select *
       ,rownum = row_number() over(partition by userid order by userid)
  from a
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36157479
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bs600, спасибо,
но я забыл написать, что тест проводился на SQL Server 2000, а не на SQL Server 2005, и поэтому надо было сделать симуляцию функции "row_number() over(partition by userid order by userid)" для SQL Server 2000.

У меня такая симуляция не получилась. Может быть кто-то подскажет как просимулировать функцию "row_number() over(partition by userid order by userid)" в SQL Server 2000 ?
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36157604
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare @a table (userid int,date0 datetime)
insert into @a 
select  300 , '2009-08-19 17:38:11.790'
union all select  300 , '2009-08-19 17:38:11.790'
union all select  300 , '2009-08-19 17:38:11.790'
union all select  300 , '2009-08-19 17:38:11.790'
union all select  300 , '2009-08-19 17:38:11.790'
union all select  302 , '2009-08-19 17:38:11.790'
union all select  302 , '2009-08-19 17:38:11.790'
union all select  302 , '2009-08-19 17:38:11.790'
union all select  303 , '2009-08-19 17:38:11.790'
union all select  303 , '2009-08-19 17:38:11.790'

declare @b table(pk int identity( 1 , 1 ),userid int,date0 datetime)
insert into @b 
select * from @a

select 
		T1.userid,
		T1.date0,
		(select count(*) 
			from @b as T2
			where T2.pk <= T1.pk and 
				T2.userid = T1.userid 
		) as rank
from @b as T1
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36157617
bsr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bsr
Гость
Извините за офтоп, но, для чего "Модератор: Тема перенесена из форума "Microsoft SQL Server"." ?
Какое отношение она имеет к сертификации?

А на форуме "Microsoft SQL Server" обитает значительно больше спецов по этой теме!
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36157807
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iiyama, спасибо большое за решение Тест 1.


может быть кто-то из коллег даст свое решение Тест 2 ?

Тест 2.
---------
Дается таблица "create table b (userid int,date2 datetime,count2 int )".
Запрос "select * from b" приносит результат:
userid date2 count2
--------- ------------------------- -----------
300 2009-01-01 18:08:41.270 5
300 2009-01-02 18:08:41.270 6
300 2009-01-09 18:08:41.270 45
300 2009-01-10 18:08:41.270 35
302 2009-01-17 18:08:41.270 50
302 2009-01-18 18:08:41.270 8
302 2009-01-03 18:08:41.270 84
302 2009-01-05 18:08:41.270 24

Надо просуммировать значения поля "count2" для каждого 8-ми дневного периода, исходя из значений поля "period", внутри каждого значения поля "userid" в предложенной ниже форме, т.е. добиться следующего результата:
userid period count2
--------- ------------------------- -----------
300 2009-01-01 - 2009-01-08 11
300 2009-01-09 - 2009-01-16 80
302 2009-01-01 - 2009-01-08 108
302 2009-01-16 - 2009-01-25 58

Примечание: для примера я взял только два значения поля "userid" для трех первых 8-ми дневных периодов года, а в задание имелось в виду неограниченное количество значений поля "userid" для всех 8-ми дневных периодов года.
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36157812
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bsrИзвините за офтоп, но, для чего "Модератор: Тема перенесена из форума "Microsoft SQL Server"." ?
Какое отношение она имеет к сертификации?

А на форуме "Microsoft SQL Server" обитает значительно больше спецов по этой теме!может быть сертификационные тесты содержат такие задачи ?
тогда интересно было бы найти в инете такие задачки. может быть кто-то подскажет где искать ?
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36171355
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где можно узнать о курсах по SQL Server BI / OLАP (SSIS, SSAS и т.п.) ?
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36181961
--__Александр__--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лимон
Начните решать задачки с sql-ex.ru. Решив первую сотню - на собеседовании будете щелкать все задачки как орешки.

Лимон
Где можно узнать о курсах по SQL Server BI / OLАP (SSIS, SSAS и т.п.)


А что вам хочется узнать?

Примерный план действий:
-Заходите на сайт мелкомягких
-Смотрите, какую литературу рекомендуют к каждому курсу.
-Качаете тренинг киты + книжки и читаете их.

По пункту Задаче 2.
Идея решения:
-Генерите восьмидневные интервалы (делается с помощью cross join и последовательности натуральных чисел)
-Получате таблицу вида:
2009-01-01 - 2009-01-08
2009-01-09 - 2009-01-16
2009-01-17 - 2009-01-25
..................................
-Дальше простой джойн и группировка.
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36230293
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--__Александр__--Лимон
Начните решать задачки с sql-ex.ru. Решив первую сотню - на собеседовании будете щелкать все задачки как орешки.Вы имеете в виду "Start testing" здесь http://sql-ex.ru/tsql/index.php ?

--__Александр__--По пункту Задаче 2.
Идея решения:
-Генерите восьмидневные интервалы (делается с помощью cross join и последовательности натуральных чисел)
-Получате таблицу вида:
2009-01-01 - 2009-01-08
2009-01-09 - 2009-01-16
2009-01-17 - 2009-01-25
..................................
-Дальше простой джойн и группировка.Спасибо.
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36230857
guest-01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лимон,

Варинат решения для задачи 2 без исп. временных таблиц

declare @df as datetime
set @df = '01.01.2009'

select userid,
CONVERT(varchar(10), DATEADD(dd, CEILING(DATEDIFF(dd, @df, date2)/8)*8,@df),104) + ' - ' +
CONVERT(varchar(10),DATEADD(dd, CEILING(DATEDIFF(dd, @df, date2)/8)*8 + 8,@df),104) as period,
SUM(count2) as sumcount
from b
group by userid,CEILING(DATEDIFF(dd, @df, date2)/8 )
order by userid
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36325051
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest-01Лимон,

Варинат решения для задачи 2 без исп. временных таблиц

declare @df as datetime
set @df = '01.01.2009'

select userid,
CONVERT(varchar(10), DATEADD(dd, CEILING(DATEDIFF(dd, @df, date2)/8)*8,@df),104) + ' - ' +
CONVERT(varchar(10),DATEADD(dd, CEILING(DATEDIFF(dd, @df, date2)/8)*8 + 8,@df),104) as period,
SUM(count2) as sumcount
from b
group by userid,CEILING(DATEDIFF(dd, @df, date2)/8 )
order by useridguest-01, спасибо.

Тест 3.
Как можно дизайнировать одну или две таблицы, содержащие информацию о дереве всех директорий и под-директорий на Windows компьютере, что эффективно запрашивать:
- все отцовские директории всех вышестоящих уровней для данной под-директории ?
- все дочернии под-директории всех нижестоящих уровней для данной директории ?
И каковы примеры наиболее эффективных запросов приносящих требуемую информацию ?

Реализовать эту задачку надо средствами SQL Server 2005.
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36334631
sanfrancisco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и мое решение в копилку )

Тест1

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
declare @a table (userid int null,date0 datetime)
insert into @a 
select  300 , '2009-08-19 17:38:11.790'
union all select  300 , '2009-08-19 17:38:11.790'
union all select  300 , '2009-08-19 17:38:11.790'
union all select  300 , '2009-08-19 17:38:11.790'
union all select  300 , '2009-08-19 17:38:11.790'
union all select  302 , '2009-08-19 17:38:11.790'
union all select  302 , '2009-08-19 17:38:11.790'
union all select  302 , '2009-08-19 17:38:11.790'
union all select  303 , '2009-08-19 17:38:11.790'
union all select  303 , '2009-08-19 17:38:11.790'
;
with tt(userid, date0, counter1) as (
	select userid, date0 as date0, COUNT(*) as counter1
	from @a 
	group by userid, date0
	union all
	select t1.userid, t1.date0, tt.counter1 -  1 
	from @a as t1	
		inner join tt on tt.userid = t1.userid and tt.counter1 >  1 
)
select distinct (tt.userid), tt.date0, tt.counter1
from tt
order by  1 ,  2 
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36364046
Лимон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanfrancisco, cпасибо.
Использование рекурсии - это интересное решение.

А может быть Вы предложите решение с использованием рекурсии для Теста 3.
Как можно дизайнировать одну или две таблицы, содержащие информацию о дереве всех директорий и под-директорий на Windows компьютере, что эффективно запрашивать:
- все отцовские директории всех вышестоящих уровней для данной под-директории ?
- все дочернии под-директории всех нижестоящих уровней для данной директории ?
И каковы примеры наиболее эффективных запросов приносящих требуемую информацию ?


Я предлагаю сдедующее решение для дизайна :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE prntdir
(id int IDENTITY( 1 , 1 ) NOT NULL,
 nmdir nvarchar(max) NULL); 
alter TABLE prntdir add constraint pk_prntdir
 primary key (id);

CREATE TABLE sondir
(id int NOT NULL,
 prntid int NOT NULL) 
alter TABLE sondir add constraint pk_sondir
 primary key (id);
alter TABLE sondir add constraint fk_sondir0
 foreign key (id) references prntdir(id);

при этом sondir.id и prntdir.id должны совпадать, а для корневых директорий типа 'c:\' совпадают также sondir.id и sondir.prntid. как, например, в следующем примере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
begin tran
insert into prntdir values ('c:')
insert into prntdir values ('d:')
insert into prntdir values ('e:')
commit tran

begin tran
insert into prntdir values ('Acer')
insert into prntdir values ('Book')
insert into prntdir values ('Elements')
insert into prntdir values ('Intel')
insert into prntdir values ('Program Files')
insert into prntdir values ('Project')
insert into prntdir values ('SmartDraw 2010')
insert into prntdir values ('totalcmd')
insert into prntdir values ('Users')
insert into prntdir values ('Windows')
commit tran

begin tran
insert into prntdir values ('Google')
insert into prntdir values ('Mobility Center')
insert into prntdir values ('Preload')
commit tran

begin tran
insert into sondir values ( 1 , 1 )
insert into sondir values ( 2 , 2 )
insert into sondir values ( 3 , 3 )
commit tran

begin tran
insert into sondir values ( 4 , 1 )
insert into sondir values ( 5 , 1 )
insert into sondir values ( 6 , 1 )
insert into sondir values ( 7 , 1 )
insert into sondir values ( 8 , 1 )
insert into sondir values ( 9 , 1 )
insert into sondir values ( 10 , 1 )
insert into sondir values ( 11 , 1 )
insert into sondir values ( 12 , 1 )
insert into sondir values ( 13 , 1 )
commit tran

begin tran
insert into sondir values ( 14 , 4 )
insert into sondir values ( 15 , 4 )
insert into sondir values ( 16 , 4 )
commit tran

begin tran
insert into prntdir values ('GoogleSetup')
insert into sondir values ( 17 , 14 )
commit tran 

begin tran
insert into prntdir values ('Acer')
insert into sondir values ( 18 , 16 )
insert into prntdir values ('Autorun')
insert into sondir values ( 19 , 16 )
commit tran 

Вот запрос, который разворачивает все дерево:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select t2.prntid parent_id,
       (select t1.nmdir from prntdir t1
        where t1.id = t2.prntid) as parent_name,
        t2.id as id,
       (select t3.nmdir from prntdir t3
        where t3.id = t2.id) as son_name
from sondir t2
order by t2.prntid,t2.id

А как построить запросы, которые пинесут из этих двух таблиц:
- все отцовские директории всех вышестоящих уровней для данной под-директории ?
- все дочернии под-директории всех нижестоящих уровней для данной директории ?
...
Рейтинг: 0 / 0
Тесты по Transact-SQL на интервью для пиема на работу
    #36432188
sanfrancisco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лимон,

Тест 3. Посмотрите bol по CTE (WITH).
Там есть пример на основе AdventureWorks с применением рекурсии. Там вяжется Сотрудник список его подчиненных (если мне не изменяет память).

Переложите этот пример на вашу задачу. Ну и есть стандартный подход к реализации таких древовидных структур.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE [dbo].[catalogs](
	[cat_id] [int] NOT NULL,
	[parent_cat_id] [int] NULL,
	[path] [varchar](max) NOT NULL,
 CONSTRAINT [PK_catalogs] PRIMARY KEY CLUSTERED 
(
	[cat_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Код: plaintext
1.
2.
3.
4.
ALTER TABLE [dbo].[catalogs]  WITH CHECK ADD  CONSTRAINT [FK_catalogs_catalogs] FOREIGN KEY([parent_cat_id])
REFERENCES [dbo].[catalogs] ([cat_id])

ALTER TABLE [dbo].[catalogs] CHECK CONSTRAINT [FK_catalogs_catalogs]
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Тесты по Transact-SQL на интервью для пиема на работу
    #37337562
staya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Первая задача:

create table #t (userid int,date0 datetime, id int identity)

insert #t
(userid, date0)
select userid, date0
from a

select *,
(select count(1) + 1 from #t t2 where t1.userid = t2.userid and t1.id>t2.id) as ord
from #t t1
order by userid, ord

drop table #t

Вторая задача:

select userid,
convert(varchar(100), dateadd(day, g.diff * 8, g.min_date), 4) + ' - ' +
convert(varchar(100), dateadd(day, g.diff * 8 + 7, g.min_date), 4),
sum(count2) as count2
from b
join (
select cast(datediff(day, m.min_date, date2)/8 as int) as diff, m.min_date
from b,
(select min(date2) as min_date from b) m
group by cast(datediff(day, m.min_date, date2)/8 as int), m.min_date
) g
on cast(datediff(day, g.min_date, date2)/8 as int) = g.diff
group by userid, g.diff, g.min_date
order by userid, diff
go
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Сертификация и обучение [игнор отключен] [закрыт для гостей] / Тесты по Transact-SQL на интервью для пиема на работу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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