SQL查询,INNER JOIN和ROW over PARTITION,我这样做了吗?

时间:2018-02-03 12:43:02

标签: sql sql-server inner-join window-functions

我有存储传入电子邮件的表,我使用此表然后回复电子邮件并记录在我已回复给他们的单独日志表中。

我需要编写一些SQL来执行以下操作:

如果收到的电子邮件是新的(未回复),例如没有被放入日志表然后我发送电子邮件回复A,然后我需要检查传入的电子邮件是否是新的,但此用户先前已通过电子邮件发送,如果是,我发送回复B.

到目前为止,我有这个......

SELECT *,
CASE WHEN ISNULL(FOLLOWUP.EmailId, 0) = 0 THEN CAST(0 AS BIT)
     ELSE CAST(1 AS BIT)
END AS FollowUp   
from INCOMINGEMAILS CE 
LEFT JOIN 
(
    SELECT *, row_number() over(partition by EmailSenderId order by CreateDate desc) as rn
    FROM INCOMINGEMAILS 

) FOLLOWUP ON CE.EmailSenderId = FOLLOWUP.EmailSenderId AND FOLLOWUP.rn = 1 AND CE.EmailId <> FOLLOWUP.EmailId 
WHERE CE.EmailId NOT IN (
    SELECT EPL.EmailId  FROM LOG EPL 
    WHERE ISNULL(EPL.Processed, CAST(0 AS BIT)) = CAST(1 AS BIT)
)
AND ISNULL(CE.EmailSenderId, 0) <> 0

所以基本上我正在做的是首先检查新传入的电子邮件实际上是新的,例如尚未插入日志中。如果是这样,我将发送电子邮件回复A.

然后我检查电子邮件回复是否是新的但电子邮件发件人之前已经发送了另一封电子邮件,我这样做是通过左连接然后做一个案例陈述来填充'followup'字段。

如果字段'followup'是1 / true,那么我发送电子邮件回复B.

任何人都可以看到我在这里做的任何瑕疵,这看起来像是针对我的情况执行的正确查询吗?

任何反馈都非常感谢。

创建脚本

CREATE TABLE [dbo].[INCOMINGEMAILS](
    [Id] [int] IDENTITY(1,1) NOT NULL, -- PK, AUTO INCREMENT
    [EmailId] [int] NULL, -- UNIQUE EMAIL ID
    [EmailSenderId] [int] NULL, -- UNIQUE ID FOR USER/EMAIL SENDER
    [EmailAddress] [nvarchar](250) NULL,
    [EmailContent] [nvarchar](MAX) NULL
}

0 个答案:

没有答案