Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Тесты при  [new]
MagistrR
Member

Откуда:
Сообщений: 31
_ч_,
Группировку я использовал потому как считал, что так запрос выполнится быстрее.
15 июн 11, 12:05    [10814958]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
MagistrR
_ч_,
Группировку я использовал потому как считал, что так запрос выполнится быстрее.
хм
15 июн 11, 12:06    [10814978]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
MagistrR
WarAnt,

Т.е. Вы считаете, что мой запрос написан верно за исключением приведения к date?


наоборот он написан совсем неправильно,
если судить по ТЗ должно быть нечто такое:
SELECT distinct user_id
  FROM Table t
  WHERE date_end >= @date_start AND date_start <= @date_end
15 июн 11, 12:16    [10815071]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
MagistrR
Member

Откуда:
Сообщений: 31
WarAnt,

Я оказался не внимательным. В задании указано вывести сотрудников и не указано что надо ещё выводить период времени.
15 июн 11, 12:36    [10815234]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
MagistrR
Member

Откуда:
Сообщений: 31
Тогда ещё два последних задания которые были мне предложены.
Задание 1.
Напишите запрос, выводящий из таблицы список id сотрудников с нумерацией по дате рождения и с убывающей сортировкой по зарплате.

Исходная таблица:
Table(user_id int,
birthday datetime,
salary money)

Требуемый результат:
Table(number int, user_id int)

Мое решение
SELECT t.user_id, ROW_NUMBER() OVER (ORDER BY t.birthday) AS number
FROM Table t with (nolock)
ORDER BY t.salary desc

Задание 2.
Имеется таблица — лог температурных изменений за год.
create table T (dt datetime, t float)
Необходимо написать запрос, выводящий три поля: день, максимальная температура за день, час, в котором максимальная температура достигнута.Запрос должен выводить, например, такую выборку:

dt t h
2006-07-06 25 12:00
2006-07-07 22 14:00

Мое решение
SELECT convert(DATE, dt) AS dt,
       convert(VARCHAR(5), convert(TIME, dt)) AS t,       
       MAX(t) AS h
  FROM T
  GROUP BY convert(VARCHAR(5), convert(TIME, dt)),
           convert(DATE, dt)

Прокомментируйте пожалуйста или укажите на ошибки.
15 июн 11, 14:21    [10816104]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
MagistrR,

DATEPART
15 июн 11, 14:27    [10816170]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
_ч_
Member

Откуда:
Сообщений: 1446
MagistrR
Необходимо написать запрос, выводящий три поля: день, максимальная температура за день, час, в котором максимальная температура достигнута.Запрос должен выводить, например, такую выборку:

dt t h
2006-07-06 25 12:00
2006-07-07 22 14:00

Мое решение
SELECT convert(DATE, dt) AS dt,
       convert(VARCHAR(5), convert(TIME, dt)) AS t,       
       MAX(t) AS h
  FROM T
  GROUP BY convert(VARCHAR(5), convert(TIME, dt)),
           convert(DATE, dt)

Прокомментируйте пожалуйста или укажите на ошибки.


А ничего что Ваш запрос выведет максимальную температуру не за день, а за час?
15 июн 11, 14:35    [10816237]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
_ч_
Member

Откуда:
Сообщений: 1446
Задание 2

select День, МАХ_температура, DATEPART(Hour, dt) AS [Час] from(
select CONVERT(date, dt) as [День], MAX(t) as [МАХ_температура] from T
group by CONVERT(date, dt))A
inner join T on T.t = A.[МАХ_температура] and CONVERT(date, T.dt) = A.День 
15 июн 11, 14:36    [10816248]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
MagistrR,

Задача 1 -- с какой целью указан хинт nolock
Задача 2 -- что делать, если одинаковая максимальная температура наблюдалась несколько раз в разные часы?
15 июн 11, 14:53    [10816368]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
MagistrR
Member

Откуда:
Сообщений: 31
invm,

nolock указано по привычке. Про одинаковую максимальную температуру несколько раз в разные часы как-то не подумал.
15 июн 11, 15:01    [10816450]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
MagistrR,

Дурная привычка. Отвыкайте.

Задача 2, решение "в лоб":
declare @t table (dt datetime, t float)

insert into @t
values
 ('20110614 12:00', 15),
 ('20110614 14:00', 20),
 ('20110614 16:00', 20),
 ('20110615 11:00', 18),
 ('20110615 18:00', 19)

;with t
as
(
 select
  cast(dt as date) as d, cast(dt as time) as tm, t,
  rank() over (partition by cast(dt as date) order by t desc) as r
 from
  @t
)
select
 d, tm, t
from
 t 
where
 r = 1
order by
 d, tm
 
15 июн 11, 15:06    [10816499]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Maks Bragar
Member

Откуда: UA->AT
Сообщений: 165
SELECT DATEDIFF(dd, '', t.dt),
MAX(DATEPART(Hh, t.dt)),
MAX(t.t)
FROM t t
GROUP BY
DATEDIFF(dd, '', t.dt)
15 июн 11, 15:17    [10816584]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Maks Bragar
Member

Откуда: UA->AT
Сообщений: 165
Maks Bragar
SELECT DATEDIFF(dd, '', t.dt),
MAX(DATEPART(Hh, t.dt)),
MAX(t.t)
FROM t t
GROUP BY
DATEDIFF(dd, '', t.dt)

сорри не прав :-(, удалить
15 июн 11, 15:19    [10816606]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Maks Bragar
Member

Откуда: UA->AT
Сообщений: 165
/*
SELECT *
FROM   t
2011-06-14 12:00:00.000	15
2011-06-15 18:00:00.000	19
2011-06-15 11:00:00.000	18
2011-06-14 16:00:00.000	20
2011-06-14 14:00:00.000	20
2011-06-14 10:00:00.000	35
2011-06-14 10:30:00.000	36
*/
SELECT MAX(t2.dt),
       MAX(DATEPART(Hh, t2.dt)),
       t3.tt
FROM   t t2
       JOIN (
                SELECT DATEDIFF(dd, '', t1.dt) AS dd,
                       MAX(t1.t) AS tt
                FROM   t t1
                GROUP BY
                       DATEDIFF(dd, '', t1.dt)
            ) t3
            ON  DATEDIFF(dd, '', t2.dt) = t3.dd
            AND t2.t = t3.tt
GROUP BY
       DATEDIFF(dd, '', t2.dt),
       t3.tt
/*
2011-06-14 10:30:00.000	10	36
2011-06-15 18:00:00.000	18	19
*/
15 июн 11, 15:36    [10816779]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Strangers
Member [заблокирован]

Откуда: Україна
Сообщений: 2613
invm
MagistrR,

Задача 2, решение "в лоб":
declare @t table (dt datetime, t float)

insert into @t
values
 ('20110614 12:01', 20),
 ('20110614 12:05', 20),
 ('20110614 16:00', 20),
 ('20110615 11:00', 18),
 ('20110615 18:00', 19)

;with t
as
(
 select
  cast(dt as date) as d, cast(dt as time) as tm, t,
  rank() over (partition by cast(dt as date) order by t desc) as r
 from
  @t
)
select
 d, tm, t
from
 t 
where
 r = 1
order by
 d, tm
 


не работает, если указаны минуты
15 июн 11, 15:48    [10816891]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Если попроще, то как-то так, наверное:


declare @t table (dt datetime, t float)

insert into @t
values
 ('20110614 12:00', 15),
 ('20110614 14:00', 20),
 ('20110614 16:00', 20),
 ('20110615 11:00', 18),
 ('20110615 18:00', 19)
 ,('20110616 19:00', 20)
 ,('20110616 18:05', 20)
 ,('20060706 12:00', 22)
,('20060707 14:00', 22) 



select CAST(dt as date) dt, CAST(dt as time) tt, t_max
from
(
	select dt, MAX(t)  over (partition by CAST(dt as date)) t_max, t
	from @t
)t
where t_max=t	
15 июн 11, 16:20    [10817172]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
declare @t table (dt datetime, t float)

insert into @t
values
 ('20110614 12:01', 20),
 ('20110614 12:05', 20),
 ('20110614 16:00', 20),
 ('20110615 11:00', 18),
 ('20110615 18:00', 19)

;with t
as
(
 select
  cast(dt as date) as d, datepart(hour, dt) as tm, t,
  rank() over (partition by cast(dt as date) order by t desc) as r
 from
  @t
)
select top (1) with ties
 d, tm, t
from
 t 
where
 r = 1
order by
 row_number() over (partition by d, tm order by (select 1))
15 июн 11, 16:37    [10817347]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
MagistrR
Member

Откуда:
Сообщений: 31
Спасибо большое всем за помощь. Теперь знаю в где были мои ошибки. Оказывается сколько нюансов в казалось бы простых заданиях.
15 июн 11, 17:27    [10817819]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
smls
Guest
Maks Bragar,
При повторении максимальной температуры больше 1 раза за день Ваш запрос выдаст только 1 значение для данного дня.
Кроме того, у многих работодателей стоят скули младше 2005 и всякие over будут не поняты.


select convert(varchar(8), ww.dt,112),ww.t,convert(varchar(8), ww.dt,108) from #t ww
inner join
(select max(t) mt,convert(varchar(8), dt,112) d1 from #t group by convert(varchar(8), dt,112)) qq
on (convert(varchar(8), ww.dt,112)=qq.d1 and ww.t=qq.mt)
order by convert(varchar(8), ww.dt,112),convert(varchar(8), ww.dt,108)
16 июн 11, 14:53    [10822318]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
midavik
Member

Откуда:
Сообщений: 216
Задание про температуру:

Вариант 1

select CONVERT(VARCHAR(10), T1.dt, 120) as dt, T1.t, CONVERT(VARCHAR(5), T1.dt, 108)  as h  from table_1 T1
inner join
(select DATEPART(dd, dt) as dt, max(t) as t from table_1 T group by DATEPART(dd, dt)) T2
on T1.t = T2.t and DATEPART(dd, T1.dt) = T2.dt

Вариант 2

select CONVERT(VARCHAR(10), dt, 120) as dt, t, CONVERT(VARCHAR(5), dt, 108)  as h  from table_1
where t in (select max(t) as t from table_1 group by DATEPART(dd, dt))
order by dt

Только вот не соображу какой из них лучше (производительнее) и почему?
16 ноя 11, 20:00    [11608954]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
midavik
....
Только вот не соображу какой из них лучше (производительнее) и почему?

План запроса поможет, но оба варианта решения не правильные.
16 ноя 11, 23:35    [11609603]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
midavik
Member

Откуда:
Сообщений: 216
Сергей Мишин
midavik
....
Только вот не соображу какой из них лучше (производительнее) и почему?

План запроса поможет, но оба варианта решения не правильные.


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

Планы я смотрел, но в них не понимаю почти ничего (нужно про них почитать)
16 ноя 11, 23:53    [11609676]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
midavik,

подозреваю, что собеседование было в Яндексе.
17 ноя 11, 02:09    [11610048]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
Обращался к MagistrR, конечно. :-)
17 ноя 11, 02:10    [11610052]     Ответить | Цитировать Сообщить модератору
 Re: Тесты при  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
midavik,
Автору нужно:
автор
Необходимо написать запрос, выводящий три поля: день, максимальная температура за день, час, в котором максимальная температура достигнута.Запрос должен выводить, например, такую выборку:

dt t h
2006-07-06 25 12:00
2006-07-07 22 14:00

Под "днём" видимо подразумевается дата.

Ваш первый вариант выводит максимальную температуру не за дату, а за номер месяца.
Второй вариант выводит запись если температура когда либо была максимум за день месяцы. Т.е. запрос может вывести за одну дату или день месяца несколько записей.
17 ноя 11, 02:32    [11610072]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить