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

Откуда:
Сообщений: 3
Есть таблица Request. Каждой записи в таблице Request соответствует несколько записей в таблице Audit. В таблице Audit есть поле DT - время последнего действия.

Нужно выбрать записи с MAX(Audit.DT) и соответсвующие этой MAX(Audit.DT) записи из Request с сортировкой по MAX(Audit.DT) с разбиением для пагинации и ограничением по MAX(Audit.DT).

Этот запрос делает все кроме "ограничения по MAX(Audit.DT)":

SELECT r.* from ( 
SELECT ROW_NUMBER() OVER (ORDER BY MAX(a.DT) DESC) AS rownum, req.RequestID, MAX(a.DT) AS a_date 
FROM [Request] req 
INNER JOIN Audit a ON (a.RequestID=req.RequestID) 
WHERE a.V2=1 AND a.ActionID=1
GROUP BY req.RequestID ) AS r 
WHERE r.rownum BETWEEN 1 AND 20


Вот такой запрос:

SELECT r.* from ( 
SELECT ROW_NUMBER() OVER (ORDER BY MAX(a.DT) DESC) AS rownum, req.RequestID, MAX(a.DT) AS a_date 
FROM [Request] req 
INNER JOIN Audit a ON (a.RequestID=req.RequestID) 
WHERE a.V2=1 AND a.ActionID=1 AND MAX(a.DT)<'20120410 11:10'
GROUP BY req.RequestID ) AS r 
WHERE r.rownum BETWEEN 1 AND 20


ругается на MAX(a.DT) там где MAX(a.DT)<'20120410 11:10'.

Подскажите какой нужен запрос чтобы наложить ограничение на MAX(a.DT) ?
12 апр 12, 18:48    [12408047]     Ответить | Цитировать Сообщить модератору
 Re: Select с пагинацией и ограниченем по максимальному значению из связанной таблицы  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
т.е. так и пишет

"Я ругаюсь на MAX(a.DT) там где MAX(a.DT)<'20120410 11:10'."

?
12 апр 12, 18:53    [12408057]     Ответить | Цитировать Сообщить модератору
 Re: Select с пагинацией и ограниченем по максимальному значению из связанной таблицы  [new]
iljy
Member

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

ясное дело ругается, и если внимательно прочитать как именно - то станет понятно, что делать.
12 апр 12, 18:55    [12408071]     Ответить | Цитировать Сообщить модератору
 Re: Select с пагинацией и ограниченем по максимальному значению из связанной таблицы  [new]
midway
Member

Откуда:
Сообщений: 3
Вот как ругается:

Статистическое выражение не может использоваться в предложении WHERE, если оно не содержится во вложенном запросе предложения HAVING или в списке выборки, и столбец, подвергаемый статистической обработке, не является внешней ссылкой.

Но ведь MAX(a.DT) AS a_date содержиться в "в списке выборки". Что не так?
13 апр 12, 06:24    [12409407]     Ответить | Цитировать Сообщить модератору
 Re: Select с пагинацией и ограниченем по максимальному значению из связанной таблицы  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
midway
Вот как ругается:

Статистическое выражение не может использоваться в предложении WHERE, если оно не содержится во вложенном запросе предложения HAVING или в списке выборки, и столбец, подвергаемый статистической обработке, не является внешней ссылкой.

Но ведь MAX(a.DT) AS a_date содержиться в "в списке выборки". Что не так?

фильтры Where применяют еще ДО того как агрегируются данные group by + max !!
Испойльзуй силу, тьху HAVING !!
13 апр 12, 11:18    [12410474]     Ответить | Цитировать Сообщить модератору
 Re: Select с пагинацией и ограниченем по максимальному значению из связанной таблицы  [new]
midway
Member

Откуда:
Сообщений: 3
Ivan Durak, таблица Audit очень большая. С having все это будет очень тормозить
16 апр 12, 10:39    [12421189]     Ответить | Цитировать Сообщить модератору
 Re: Select с пагинацией и ограниченем по максимальному значению из связанной таблицы  [new]
elfan
Member

Откуда: Россия,Тюмень
Сообщений: 54
midway,
скажите, а зачем Audit связывается с Request, что в Audit могут быть записи с RequestID, отличные от Request?
16 апр 12, 12:23    [12421841]     Ответить | Цитировать Сообщить модератору
 Re: Select с пагинацией и ограниченем по максимальному значению из связанной таблицы  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
а так?

SELECT top 20 r.* from 
( 
    SELECT ROW_NUMBER() OVER (PARTITION BY req.RequestID ORDER BY a.DT DESC) AS rownum
    , req.RequestID
    , a.DT
   FROM [Request] req 
   INNER JOIN Audit a ON (a.RequestID=req.RequestID) 
   WHERE a.V2=1 AND a.ActionID=1 AND a.DT<'20120410 11:10'
) AS r 
WHERE r.rownum = 1
ORDER BY r.DT
16 апр 12, 13:06    [12422122]     Ответить | Цитировать Сообщить модератору
 Re: Select с пагинацией и ограниченем по максимальному значению из связанной таблицы  [new]
elfan
Member

Откуда: Россия,Тюмень
Сообщений: 54
возможно так,
SELECT r.* from ( 
SELECT ROW_NUMBER() OVER (ORDER BY MAX(a.DT) DESC) AS rownum, req.RequestID, MAX(a.DT) AS a_date 
FROM [Request] req 
INNER JOIN Audit a ON (a.RequestID=req.RequestID) 
WHERE a.V2=1 AND a.ActionID=1 and req.RequestID not in(select RequestID from Audit where Dt>='20120410 11:10')
GROUP BY req.RequestID 
) AS r 
WHERE r.rownum BETWEEN 1 AND 20
16 апр 12, 13:19    [12422192]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить