如何从表上的多个联接返回不同的值

时间:2019-06-05 03:11:44

标签: sql-server

我试图从Message表中获取不同的值,但是由于表上的多个联接而无法成功。

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

此查询将获取不同的记录。由于在包含UserName时也需要UserName,因此无法获得所需的不同结果,因为在USER_MESSAGE表中我有重复的CHATID。

以上查询返回了以下结果:

enter image description here

在包含用户名时,我得到以下结果,其中聊天ID重复:

[![在此处输入图片描述] [2]] [2]

1 个答案:

答案 0 :(得分:3)

也许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;