Простая проблема SQL - PullRequest
       8

Простая проблема SQL

2 голосов
/ 21 июля 2010

Не могу поверить, что застрял на том, что кажется таким простым запросом.

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

SELECT L.User
FROM Log AS L
WHERE L.Id = 24
GROUP BY L.ProjectId
HAVING MAX(L.DateLogged) = L.DateLogged

Но это бросает «Столбец Log.DateLogged» недопустим в предложении HAVING, потому что он не содержится ни в статистической функции, ни в предложении GROUP BY. Но я не хочу, чтобы он группировался по DateLogged, и при этом я не хочу, чтобы он был в статистической функции.

Ответы [ 3 ]

5 голосов
/ 21 июля 2010

Я думаю, что если вы используете L.Id = 24, вы получите только ОДИН ряд. ИМО вы должны фильтровать по L.User или L.UserId, а не по L.Id

Для списка всех проектов это то, что вы можете сделать.

SELECT L.User, L.ProjectId, MAX (L.DateLogged) as DateLogged
FROM Log AS L
WHERE L.User = @YourUserNameGoesHere
GROUP BY L.User, L.ProjectId

Для отдельного проекта, для которого вы знаете детали проекта, просто используйте ORDER BY

SELECT TOP 1 L.User, L.DateLogged
FROM Log AS L
WHERE L.User = @YourUserNameGoesHere
AND L.ProjectId = @YourProjectIdGoesHere
ORDER BY L.DateLogged DESC
1 голос
/ 21 июля 2010

Я не уверен, что это то, что вы хотели, но, возможно, эти примеры помогут вам.

Получить пользователя журнала @LogId для проекта @ProjectId с максимальным значением DateLogged:

SELECT TOP(1) L.User
FROM Log AS L
WHERE L.Id = @LogId AND L.ProjectId = @ProjectId
ORDER BY L.DateLogged DESC

Получить пользователей с максимальным DateLogged в журнале @LogId для каждого проекта:

SELECT L.User, L.ProjectId
FROM Log AS L
WHERE L.Id = @LogId
  AND L.DateLogged = (
    SELECT MAX(L2.DateLogged) FROM Log AS L2
    WHERE L2.Id = L.Id AND L2.ProjectId = L.ProjectId
  )
0 голосов
/ 21 июля 2010

Это похоже на ответ YRH, но использует коррелированную функцию (ROWNUMBER) вместо коррелированного подзапроса - это может быть более эффективным:

DECLARE @ProjectId int
SELECT  L.[User],
        L.ProjectId
FROM    (SELECT L.[User],
                L.ProjectId
                ROW_NUMBER() OVER (PARTITION BY L.ProjectId ORDER BY DateLogged DESC) RN
         FROM   dbo.[Log] L
         WHERE L.Id = @LogId) L
WHERE   RN = 1
...