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

Откуда:
Сообщений: 29
Добрый день,

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

Есть таблица вида:

Имя проекта Название задачи Дата начала
Проект 1 Задача 1 01.02.13
Проект 1 Задача 2 12.03.13
Проект 1 Задача 3 17.03.13
Проект 1 Задача 4 25.03.13
Проект 1 Задача 5 01.04.13
Проект 1 Задача 6 15.04.13
Проект 1 Задача 7 20.04.13
Проект 2 Задача 1 02.02.13
Проект 2 Задача 2 14.03.13
Проект 2 Задача 3 17.03.13
Проект 2 Задача 4 21.03.13
Проект 2 Задача 5 23.03.13
Проект 2 Задача 6 29.03.13


нужно выбрать по каждому проекту четыре задачи с ближайшими датами начала к текущей дате. То есть, получить список:

Имя проекта Название задачи Дата начала
Проект 1 Задача 1 01.02.13
Проект 1 Задача 2 12.03.13
Проект 1 Задача 3 17.03.13
Проект 1 Задача 4 25.03.13
Проект 2 Задача 1 02.02.13
Проект 2 Задача 2 14.03.13
Проект 2 Задача 3 17.03.13
Проект 2 Задача 4 21.03.13

помогите, пожалуйста, советом.
27 мар 13, 17:59    [14103552]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простой запрос  [new]
iiyama
Member

Откуда:
Сообщений: 642
row_number
27 мар 13, 18:02    [14103565]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простой запрос  [new]
TheIgor
Member

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

не совсем вас понял, мне нужно выбрать первые четыре строки по каждому проекту, удовлетворяющим определенному условию, если я присвою им номера, по первому проекту все будет просто, но по следующим я не смогу определить, что выбирать.
27 мар 13, 18:08    [14103601]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простой запрос  [new]
PaulYoung
Member

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

CREATE TABLE #t (pr VARCHAR(128), task VARCHAR(128), dt DATETIME)

INSERT INTO #t
(
	pr,
	task,
	dt
)
select 'Проект 1', 'Задача 1', CONVERT(DATETIME, '01.02.2013', 104) UNION all
select 'Проект 1', 'Задача 2', CONVERT(DATETIME, '12.03.2013', 104) UNION all
select 'Проект 1', 'Задача 3', CONVERT(DATETIME, '17.03.2013', 104) UNION all
select 'Проект 1', 'Задача 4', CONVERT(DATETIME, '25.03.2013', 104) UNION all
select 'Проект 1', 'Задача 5', CONVERT(DATETIME, '01.04.2013', 104) UNION all
select 'Проект 1', 'Задача 6', CONVERT(DATETIME, '15.04.2013', 104) UNION all
select 'Проект 1', 'Задача 7', CONVERT(DATETIME, '20.04.2013', 104) UNION all
select 'Проект 2', 'Задача 1', CONVERT(DATETIME, '02.02.2013', 104) UNION all
select 'Проект 2', 'Задача 2', CONVERT(DATETIME, '14.03.2013', 104) UNION all
select 'Проект 2', 'Задача 3', CONVERT(DATETIME, '17.03.2013', 104) UNION all
select 'Проект 2', 'Задача 4', CONVERT(DATETIME, '21.03.2013', 104) UNION all
select 'Проект 2', 'Задача 5', CONVERT(DATETIME, '23.03.2013', 104) UNION all
select 'Проект 2', 'Задача 6', CONVERT(DATETIME, '29.03.2013', 104)

SELECT
  x.*
FROM
(
SELECT
  ROW_NUMBER() OVER (PARTITION BY pr ORDER BY dt DESC) AS rn,
  pr,
  task,
  dt
FROM #t
WHERE dt <= GETDATE()
) x
WHERE x.rn BETWEEN 1 AND 4
ORDER BY x.pr, x.dt
27 мар 13, 18:12    [14103615]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простой запрос  [new]
TheIgor
Member

Откуда:
Сообщений: 29
Спасибо вам большое!
27 мар 13, 18:16    [14103639]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простой запрос  [new]
zozozozozo
Guest
with tbl
as
(
select m.*
from (values
	
('Проект 1', 'Задача 1', cast('20130201' as datetime)),
('Проект 1', 'Задача 2', cast('20130312' as datetime)),
('Проект 1', 'Задача 3', cast('20130317' as datetime)),
('Проект 1', 'Задача 4', cast('20130325' as datetime)),
('Проект 1', 'Задача 5', cast('20130401' as datetime)),
('Проект 1', 'Задача 6', cast('20130415' as datetime)),
('Проект 1', 'Задача 7', cast('20130420' as datetime)),
('Проект 2', 'Задача 1', cast('20130202' as datetime)),
('Проект 2', 'Задача 2', cast('20130314' as datetime)),
('Проект 2', 'Задача 3', cast('20130317' as datetime)),
('Проект 2', 'Задача 4', cast('20130321' as datetime)),
('Проект 2', 'Задача 5', cast('20130323' as datetime)),
('Проект 2', 'Задача 6', cast('20130329' as datetime))
	) as m(prjname, taskname, ptdate)
),
z
as
(
	select distinct prjname
	from tbl
)
select *
from
	z
		cross apply
	(
		select top(4) tbl.ptdate, tbl.taskname
		from
			tbl
		where tbl.prjname = z.prjname and tbl.ptdate < sysdatetime()
		order by tbl.ptdate desc
			
	) w
27 мар 13, 19:08    [14103873]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простой запрос  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
TheIgor
нужно выбрать по каждому проекту четыре задачи с ближайшими датами начала к текущей дате. То есть, получить список ...
Чтобы получить указанный в ТЗ список, ЯТД, "текущая дата" должна быть не позже 26.02.13 :)
set dateformat dmy
declare @date datetime='26.02.2013'

;with Tasks as (select * from (values
   ('Проект 1','Задача 1',convert(date,'01.02.2013')),
   ('Проект 1','Задача 2','12.03.2013'),('Проект 1','Задача 3','17.03.2013'),('Проект 1','Задача 4','25.03.2013'),
   ('Проект 1','Задача 5','01.04.2013'),('Проект 1','Задача 6','15.04.2013'),('Проект 1','Задача 7','20.04.2013'),
   ('Проект 2','Задача 1','02.02.2013'),('Проект 2','Задача 2','14.03.2013'),('Проект 2','Задача 3','17.03.2013'),
   ('Проект 2','Задача 4','21.03.2013'),('Проект 2','Задача 5','23.03.2013'),('Проект 2','Задача 6','29.03.2013')
   )t(project,task,date))
select * 
from (
   select 
      *,
      row_number() over (partition by project order by ABS(DATEDIFF(DAY,@date,date)))rn, 
      DATEDIFF(DAY,@date,date)days 
   from Tasks
   ) t
where rn<5
order by project, days
projecttaskdaterndays
Проект 1Задача 12013-02-013-25
Проект 1Задача 22013-03-12114
Проект 1Задача 32013-03-17219
Проект 1Задача 42013-03-25427
Проект 2Задача 12013-02-024-24
Проект 2Задача 22013-03-14116
Проект 2Задача 32013-03-17219
Проект 2Задача 42013-03-21323


Или речь идет о ближайших предстоящих задачах? Тогда не факт, что их будет четыре
27 мар 13, 19:14    [14103901]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить