Использование внутреннего соединения DISTINCT SQL - PullRequest
0 голосов
/ 18 марта 2020

У меня есть две таблицы T1 и T2. Мои таблицы выглядят примерно так Комментарии к колонке комментариев для каждого уникального AppKey

Будем весьма благодарны за любые идеи о том, как сделать эту работу.

Это пример данных:

enter image description here

Идея состоит в том, чтобы отфильтровать дублирующиеся комментарии, относящиеся к определенному ключу приложения, если вы посмотрите на строку 11-15 в столбце Appkey, это тот же самый ключ приложения, если вы посмотрите на строку 11-15 это тот же комментарий, который я хочу отфильтровать, чтобы запрос не возвращал эти повторяющиеся строки.

Ниже приведен запрос, который я использовал

SELECT Notes.Appkey,
        Notes.CommenterKey,
        Notes.Comment,
        Notes.NoteTime,
        Users.Firstname,
        Users.Lastname
FROM tblNotes AS Notes 
inner join
tblUsers AS Users ON Commenterkey = UserKey

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Ваш пример данных довольно сложно прочитать. Однако вы можете использовать row_number() или агрегацию. Я думаю, что это делает то, что вы хотите:

select un.*
from (select n.Appkey, n.CommenterKey, n.Comment, n.NoteTime,
             u.Firstname, u.Lastname,
             row_number() over (partition by u.UserKey, n.Comment order by u.UserKey) as seqnum
      from tblNotes n inner join
           tblUsers u 
           on n.Commenterkey = u.UserKey
     ) un
where seqnum = 1;
0 голосов
/ 18 марта 2020

Вы также можете использовать CTE Table. Ниже ссылка представляет собой введение в CTE Table и как его использовать

https://www.essentialsql.com/introduction-common-table-expressions-ctes/

Я думаю, что это то, что вы хотите,

with cte as 
(
        select notes.Appkey as appKey, notes.CommenterKey as CommenterKey, notes.Comment as Comment, notes.NoteTime as NoteTime,
             users.Firstname as Firstname, users.Lastname as Lastname,
             row_number() over (partition by users.UserKey, notes.Comment order by users.UserKey) as sequenceNo
      from tblNotes as notes inner join
           tblUsers as users 
           on notes.Commenterkey = users.UserKey
)

select * from cte where sequenceNo = 1;
0 голосов
/ 18 марта 2020

На основании данных примера что-то вроде этого должно работать.

select  n.NoteKey,
        n.AppKey,
        n.CommenterKey,
        n.Comment,
        u.Firstname,
        u.Lastname
from    Notes n
cross apply (
    select  AppKey,
            CommenterKey,
            Comment,
            max(NoteTime) as NoteTime
    from    Notes n2
    where   n.AppKey        = n2.AppKey
    and     n.CommenterKey  = n2.CommenterKey
    and     n.Comment       = n2.Comment
    group by 
            n2.AppKey,
            n2.CommenterKey,
            n2.Comment
) ni 
join    Users u ON u.UserKey = n.CommenterKey
where   ni.NoteTime = n.NoteTime

Возможно, ваши самые большие проблемы будут связаны с производительностью. Возможно, вы захотите добавить флаг дублирования и либо проверить с помощью триггера, либо запланированного задания.

...