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

Откуда:
Сообщений: 890
есть три столбца. групируем по первому, выбираем макс по второму, а выводим третий столбец соответствующий 2му столбцу,
вот "некрасивое решение"

DECLARE @StartMonth DATE
SET @StartMonth = '2009-02-01'

SELECT OWP.OrganizationId, PA.ProgramActivityId
FROM 
dbo.scoring_ProgramsActivities PA
INNER JOIN scoring_OrganizationWorkflowProcesses OWP ON OWP.WorkflowProcessId = PA.WorkflowProcessId
INNER JOIN
(
	SELECT MAX(PA.ActivityFinishedDate) MaxDate, OWP.OrganizationId
	FROM dbo.scoring_ProgramsActivities PA
	INNER JOIN scoring_OrganizationWorkflowProcesses OWP ON OWP.WorkflowProcessId = PA.WorkflowProcessId
	WHERE PA.ActivityFinishedDate < @StartMonth
	GROUP BY OWP.OrganizationId
) SA ON PA.ActivityFinishedDate = SA.MaxDate AND OWP.OrganizationId = SA.OrganizationId
ORDER BY OrganizationId
как переделать на красивое? :)
2 окт 09, 19:23    [7736995]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
две максимальных даты быть не могут, я так понимаю?
select top 1 with ties *
  from dbo.scoring_ProgramsActivities PA
  join scoring_OrganizationWorkflowProcesses OWP ON OWP.WorkflowProcessId = PA.WorkflowProcessId
order by row_number() over(partition by OWP.OrganizationId order by PA.ActivityFinishedDate desc)
2 окт 09, 19:30    [7737008]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Var79
Member

Откуда:
Сообщений: 890
для каждого PA.ProgramActivityId только уникальные даты, соответственно и максимальная тока одна :)

правильные выходные данные для изменненого запроса
DECLARE @StartMonth DATE
SET @StartMonth = '2009-02-01'

SELECT OWP.OrganizationId, RS.ReportStatusId, RS.ReportStatusName
FROM 
dbo.scoring_ProgramsActivities PA
INNER JOIN scoring_OrganizationWorkflowProcesses OWP ON OWP.WorkflowProcessId = PA.WorkflowProcessId
INNER JOIN
(
	SELECT MAX(PA.ActivityFinishedDate) MaxDate, OWP.OrganizationId
	FROM dbo.scoring_ProgramsActivities PA
	INNER JOIN scoring_OrganizationWorkflowProcesses OWP ON OWP.WorkflowProcessId = PA.WorkflowProcessId
	WHERE PA.ActivityFinishedDate < @StartMonth
	GROUP BY OWP.OrganizationId
) SA ON PA.ActivityFinishedDate = SA.MaxDate AND OWP.OrganizationId = SA.OrganizationId
INNER JOIN scoring_ActivitiesAccreditationStatusesReportStatuses AASRS ON AASRS.ActivityAccreditationStatusId = PA.ActivityAccreditationStatusId
INNER JOIN scoring_ReportStatuses RS ON RS.ReportStatusId = AASRS.ReportStatusId
автор

723447 1 Candidacy Materials Received
723427 1 Candidacy Materials Received
287119 1 Candidacy Materials Received
100762 1 Candidacy Materials Received
99287 2 Candidacy Denied
131313 2 Candidacy Denied
2 окт 09, 19:35    [7737027]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Var79
Member

Откуда:
Сообщений: 890
вобщем на простом примере :
на входе
id1 id2 date
1 5 1
1 6 2
2 5 3
2 7 1

на выходе надо


1 6 2
2 5 3

id2 и date в одной строке одной таблицы находятся
2 окт 09, 19:37    [7737033]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
и если добавить
Var79
INNER JOIN scoring_ActivitiesAccreditationStatusesReportStatuses AASRS ON AASRS.ActivityAccreditationStatusId = PA.ActivityAccreditationStatusId
INNER JOIN scoring_ReportStatuses RS ON RS.ReportStatusId = AASRS.ReportStatusId
в "мой" вариант решения (прямо перед order by)
то результат устраивает?
2 окт 09, 19:38    [7737037]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Var79
вобщем на простом примере
declare @t table(id1 int, id2 int, date datetime)
insert into @t(id1, id2, date)
select 1, 5, '20090101' union all
select 1, 6, '20090102' union all
select 2, 5, '20090103' union all
select 2, 7, '20090101'

select top 1 with ties *
  from @t
 order by row_number() over(partition by id1 order by date desc)

id1         id2         date
----------- ----------- -----------------------
1           6           2009-01-02 00:00:00.000
2           5           2009-01-03 00:00:00.000

(2 row(s) affected)
2 окт 09, 19:43    [7737048]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Var79
Member

Откуда:
Сообщений: 890
ой, супер! спасиба!
прощу прощения что вы моей проблеме больше уделили внимания чем я
2 окт 09, 19:49    [7737065]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Var79
Member

Откуда:
Сообщений: 890
только как то пугает (может из за того что не освоил)
row_number()
2 окт 09, 19:55    [7737079]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
меня попервах больше пугало with ties
потом - неоптимальность в угоду меньшему количеству букв
но у Вас ведь данных мало, и пару миллисекунд туда-сюда для Вас неважны?
2 окт 09, 20:00    [7737088]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Var79
Member

Откуда:
Сообщений: 890
пока 65752 записи в самой большей таблице данного запроса
максимум вырастит раз в 10 через пол года - год
5 окт 09, 13:34    [7742512]     Ответить | Цитировать Сообщить модератору
 Re: типовая задача, но в поисках простого решения сломал мозг  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
можете потестировать еще такой вариант:
;with cte as (
   select id1, id2, date
         ,row_number() over(partition by id1 order by date desc) as rn
     from @t
)
select id1, id2, date
  from cte 
 where rn = 1
помню, были когда-то темы на этом форуме, где приводились результаты экспериментов,
показывающие, что при таком подходе результат получается быстрее
5 окт 09, 13:40    [7742567]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить