Как вернуть отдельные значения из нескольких объединений в таблицах - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь получить различные значения из таблицы сообщений, но не удается, хотя из-за нескольких объединений в таблицах.

SELECT
    UR.CHATID,
    --U.USERNAME,
    MAX(UM.DATETIME)
FROM
    USER_REQUEST UR
JOIN 
    USER_MESSAGE UM ON UR.CHATID = UM.CHATID
JOIN 
    EXTENSION_USER EU ON EU.ID = UM.CHATUSERID
JOIN 
    USER_EXTENSION UE ON UE.CHATID = UM.CHATID
JOIN 
    User U ON U.ID = EU.USERID
WHERE
    CR.[CreatedOn] >= '2019-06-4 08:30:00'
    AND CR.CREATEDON < '2019-06-04 18:00:00' 
GROUP BY
    CR.CHATID

Этот запрос будет извлекать отдельные записи. Так как мне нужно также включить имя пользователя, включая имя пользователя, я не получу требуемых отчетливых результатов, поскольку в таблице USER_MESSAGE у меня есть дубликаты CHATID.

Приведенный выше запрос возвращает мне следующий результат:

enter image description here

При включении имени пользователя я получаю следующий результат, где дублируются идентификаторы чата:

[! [Введите описание изображения здесь] [2]] [2]

1 Ответ

3 голосов
/ 05 июня 2019

Возможно, ROW_NUMBER может быть полезным здесь.В этом ответе предполагается, что вам нужна запись с наибольшим значением DATETIME для каждой группы чата.

WITH cte AS (
    SELECT UR.CHATID, U.USERNAME, UM.DATETIME,
        ROW_NUMBER() OVER (PARTITION BY UR.CHATID ORDER BY UM.DATETIME DESC) rn
    FROM USER_REQUEST UR
    INNER JOIN USER_MESSAGE UM
        ON UR.CHATID = UM.CHATID
    INNER JOIN EXTENSION_USER EU
        ON EU.ID = UM.CHATUSERID
    INNER JOIN USER_EXTENSION UE
        ON UE.CHATID = UM.CHATID
    INNER JOIN User U
        ON U.ID = EU.USERID
    WHERE
        CR.CREATEDON >= '2019-06-04 08:30:00' AND
        CR.CREATEDON < '2019-06-04 18:00:00'
)

SELECT
    CHATID,
    USERNAME,
    DATETIME
FROM cte
WHERE rn = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...