2010-05-13 4 views
0

У меня есть сложная проблема, что я пытаюсь найти наиболее эффективный метод для решения.Как найти последнюю строку для каждой группы данных

Вот упрощенная версия структуры View.


Таблица: Ревизии

 
AuditID | PublicationID | AuditEndDate | AuditStartDate 
1  | 3    | 13/05/2010 | 01/01/2010 
2  | 1    | 31/12/2009 | 01/10/2009 
3  | 3    | 31/03/2010 | 01/01/2010 
4  | 3    | 31/12/2009 | 01/10/2009 
5  | 2    | 31/03/2010 | 01/01/2010 
6  | 2    | 31/12/2009 | 01/10/2009 
7  | 1    | 30/09/2009 | 01/01/2009 

Там в 3 запроса Вот что мне нужно от этого. Мне нужно, чтобы все данные были получены. Следующий, чтобы получить только данные истории (то есть все, кроме исключения последнего элемента данных AuditEndDate), а затем последний запрос - получить последний элемент данных (через AuditEndDate).

Есть еще один уровень сложности, который у меня есть ограничение по дате (это для каждого пользователя/группы), где определенные группы пользователей могут видеть только определенные даты. Вы заметите это в предложении where как AuditEndDate < = blah и AuditStartDate> = blah

Перед публикацией выберите все доступные данные.

select * from Audits 
Where auditEndDate<='31/03/10' and AuditStartDate>='06/06/2009'; 

Foreach публикации, выберите все данные, но Исключить последние доступные данные (по AuditEndDate)

select * from Audits 
left join 
(select AuditId as aid, publicationID as pid 
    and max(auditEndDate) as pend 
from Audit where auditenddate <= '31/03/2009' /* user restrict */ 
group by pid) Ax 
on Ax.pid=Audit.pubid 
where pend!=Audits.auditenddate 
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */ 

Foreach публикации, выберите только самые последние доступные данные (по AuditEndDate)

select * from Audits 
left join 
    (select AuditId as aid, publicationID as pid 
    and max(auditEndDate) as pend 
    from Audit where auditenddate <= '31/03/2009'/* user restrict */ 
    group by pid) Ax 
on Ax.pid=Audit.pubid 
where pend=Audits.auditenddate 
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */ 

Итак, на данный момент запросы 1 и 3 работают нормально, но запрос 2 просто возвращает все данные вместо ограничения.

Может ли кто-нибудь мне помочь?

Благодаря

джейсон

ответ

0

Ладно, на самом деле ... Эти запросы работают отлично. Это был мой условный PHP для их запуска. Все хорошее :)

Любой, кто может предложить более эффективный метод для этого, хотя мне было бы интересно услышать это. Первоначально я использовал sub-запросы в предложении where, и это выполнялось очень медленно ... от 2 секунд до 50 секунд ....

Смежные вопросы