Как найти последнюю строку для каждой группы данных - PullRequest
0 голосов
/ 13 мая 2010

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

Вот упрощенная версия моей структуры 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';

Для каждой публикации выберите все данные, но исключите последние доступные данные (по 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 */

Для каждой публикации выберите только самые последние доступные данные (по 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 просто возвращает все данные вместо ограничения.

Кто-нибудь может мне помочь?

Спасибо

1028 * Ясон *

1 Ответ

0 голосов
/ 13 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...