Выбор отличительного MAX NoteID для отдельных пользователей - PullRequest
2 голосов
/ 08 мая 2019

Я пытаюсь сгенерировать запрос в SQL Server с несколькими операторами JOIN, который предоставляет последний noteid для Talent (или пользователей) в нашей базе данных, а также несколько других точек данных, таких как имя таланта, категория, статус, деление иFollowupdate в моем запросе.

До сих пор я пробовал следующий запрос, но продолжаю получать несколько записей для одних и тех же талантов.

SELECT 
    MAX(n.NoteID) as Note, 
    t.FirstName, t.LastName, s.Name AS Status, 
    tc.Name AS Category, d.Name, n.FollowUpDate AS FollowUpDate
FROM 
    Notes n
JOIN 
    TalentNotes tn ON n.NoteID = tn.NoteID
JOIN 
    Talents t ON t.TalentID = tn.TalentID
JOIN 
    TalentStatuses s ON s.TalentStatusID = t.TalentStatusID
JOIN 
    TalentCategories tc ON tc.TalentCategoryID = t.TalentCategoryID
JOIN 
    Divisions d ON d.DivisionID = t.DivisionID
WHERE 
    tc.Name = 'G1'
    AND t.EmailAddress NOT LIKE '%x3%'
    OR tc.Name = 'X1'
    AND t.EmailAddress NOT LIKE '%x3%'
GROUP BY 
    t.FirstName, t.LastName, s.Name, tc.Name, d.name, n.FollowUpDate

Результаты:

enter image description here

В конечном итоге я хотел бы увидеть таблицу, в которой показан мой отличный талант с MAX NoteID, но в настоящее время я продолжаю получать несколько разных NoteID для одного и того же таланта.Любая помощь в достижении этого будет принята с благодарностью!

Ответы [ 4 ]

2 голосов
/ 08 мая 2019

Попробуйте это:

SELECT A.NoteId, A.FirstName, A.LastName, A.Status, A.Category, A.Name, A.FollowUpDate
FROM (
SELECT n.NoteId, t.FirstName, t.LastName, s.Name as Status, tc.Name as Category, d.Name, n.FollowUpDate as FollowUpDate, 
row_number() over (partition by t.FirstName, t.LastName order by n.NoteId DESC) rnk
    FROM Notes n
    JOIN TalentNotes tn ON n.NoteID=tn.NoteID
    JOIN Talents t ON t.TalentID=tn.TalentID
    JOIN TalentStatuses s ON s.TalentStatusID=t.TalentStatusID
    JOIN TalentCategories tc ON tc.TalentCategoryID=t.TalentCategoryID
    JOIN Divisions d ON d.DivisionID=t.DivisionID
    WHERE tc.Name = 'G1'
    AND t.EmailAddress NOT LIKE '%x3%'
    OR tc.Name = 'X1'
    AND t.EmailAddress NOT LIKE '%x3%')A
    where A.rnk = 1
0 голосов
/ 08 мая 2019

Вам необходимо определить, как вы хотите обработать дату последующего наблюдения.В настоящее время оно группируется, поэтому у вас будет по одной строке на отдельную дату вместе с другими членами группы.

Возможно:

MAX(n.FollowUpDate) as FollowUpDate
0 голосов
/ 08 мая 2019

Похоже, что группировка по дате следования - вот что вас запутало Я бы предложил получить максимальный идентификатор заметки для каждого таланта в CTE, а затем выбрать нужные столбцы и присоединиться к CTE:

WITH Max_Note AS (
    SELECT MAX(n.NoteID) AS NoteID, tn.TalentID
    FROM Notes n
    JOIN TalentNotes tn ON n.NoteID=tn.NoteID
    GROUP BY tn.TalentID
)
SELECT n.NoteID as Note, t.FirstName, t.LastName, s.Name as Status, tc.Name as Category, d.Name, n.FollowUpDate as FollowUpDate
FROM Max_Note n
JOIN TalentNotes tn ON n.NoteID=tn.NoteID
JOIN Talents t ON t.TalentID=tn.TalentID
JOIN TalentStatuses s ON s.TalentStatusID=t.TalentStatusID
JOIN TalentCategories tc ON tc.TalentCategoryID=t.TalentCategoryID
JOIN Divisions d ON d.DivisionID=t.DivisionID
WHERE tc.Name = 'G1'
AND t.EmailAddress NOT LIKE '%x3%'
OR tc.Name = 'X1'
AND t.EmailAddress NOT LIKE '%x3%'
0 голосов
/ 08 мая 2019

Попробуйте удалить фоллупдат из группы:

SELECT MAX(n.NoteID) as Note, t.FirstName, t.LastName, s.Name as Status, tc.Name as Category, d.Name
FROM Notes n
JOIN TalentNotes tn ON n.NoteID=tn.NoteID
JOIN Talents t ON t.TalentID=tn.TalentID
JOIN TalentStatuses s ON s.TalentStatusID=t.TalentStatusID
JOIN TalentCategories tc ON tc.TalentCategoryID=t.TalentCategoryID
JOIN Divisions d ON d.DivisionID=t.DivisionID
WHERE tc.Name = 'G1'
AND t.EmailAddress NOT LIKE '%x3%'
OR tc.Name = 'X1'
AND t.EmailAddress NOT LIKE '%x3%'
GROUP BY t.FirstName, t.LastName, s.Name, tc.Name, d.name
...