Поиск последнего человека, работающего над проектом (группировка / наличие sql?) - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь выяснить, как запросить последнего человека (имя), который в последний раз (дата) работал над проектом (проектом).

Таблица содержания A

     (id) | project  | name     | date
----------+----------+---------------------
        1 | ProjA    | Joe      | 1-1-2011
        2 | ProjA    | Sally    | 2-2-2011
        3 | ProjA    | Joe      | 3-3-2011
        4 | ProjB    | Sally    | 4-4-2011
        5 | ProjB    | Bert     | 5-5-2011

ЧтоМне нужно, чтобы в результате было в этом случае:

     (id) | project  | name     | date
----------+----------+-------------
        3 | ProjA    | Joe      | 3-3-2011
        5 | ProjB    | Bert     | 5-5-2011

То, что я получил до сих пор:

SELECT project, max(date) FROM TableA 

Это будет соответствовать проекту и дате, но неидентификатор и имя человека.

SELECT id, project, name, max(date) FROM TableA 

Это (очевидно) приведет к ошибке

Столбец 'id' недопустим в предложении HAVING, поскольку он не содержитсяв агрегатной функции или в предложении GROUP BY.

Я немного заржавел и потерян.

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Вам нужно row_number():

select a.*
from (select a.*, row_number() over (partition by a.project order by a.date desc) as seq
      from tablea a
     ) a
where a.seq = 1;

Если дата имеет связей , тогда вам нужно dense_rank().

0 голосов
/ 18 октября 2019

Попробуйте,

DECLARE @Temp_Data TABLE
(
    id int ,project varchar(30),[name] varchar(30),[date] date
)

INSERT INTO @Temp_Data
SELECT 1,'ProjA','Joe','1-1-2011' UNION ALL
SELECT 2,'ProjA','Sally','2-2-2011' UNION ALL
SELECT 3,'ProjA','Joe','3-3-2011' UNION ALL
SELECT 4,'ProjB','Sally','4-4-2011' UNION ALL
SELECT 5,'ProjB','Bert ','5-5-2011'

;WITH CTE_Temp_Data AS
(
    SELECT id, project,[name],[date],ROW_NUMBER() OVER (PARTITION BY project ORDER BY [date] DESC) AS R_NO
    FROM @Temp_Data
)

SELECT id, project,[name],[date] 
FROM CTE_Temp_Data
WHERE R_NO=1
0 голосов
/ 18 октября 2019

edit: теперь я правильно понял, но не уверен, поможет ли это. Я думаю, что так проще, но это может привести к путанице, если над одним днем ​​работают несколько пользователей:

SELECT project, name, date
FROM (
SELECT *, max_date = MAX(date) OVER (PARTITION BY project)
FROM TableA) T 
WHERE date = max_date

Cheers Andreas

Не обращайте внимания на это: Iможет не понять вопрос, но это должно сделать галочку:

SELECT id, project, name, max(date) FROM TableA
GROUP BY id, project, name
...