如果第一行为空,SQL Server 比较两行并合并第二行中的单元格

艾格尼丝·威尔克

我已经搜索了论坛,但要么无法正确提问,要么无法理解答案,需要有人带我一步一步地完成。

问题是:我的数据库中有一个表,用户。根据电子邮件比较,有一些重复。现在,根据注册日期,其中一些具有更高的优先级(我们将忽略注册日期较早的那些),但一些优先级较低的记录填充了更多信息(例如性别,地址,电话等)上)。

我想要的流程是:-> 根据电子邮件查找重复项-> 优先考虑具有最新注册日期的行-> 如果该行中的单元格为空,则用优先级较低的行中的数据填充它

ps 问题还在于,同一电子邮件可能有多达三个重复的帐户。

我无法解决这个问题..我有 我想要的

CREATE TABLE [dbo].[Person](
    [userID] [nvarchar] PRIMARY KEY,
    [email] [nvarchar] (50),
    [priority] [nvarchar](2),
    [FirstName] [nvarchar](50),
    [LastName] [nvarchar](50)
)

GO

INSERT INTO Person VALUES (1,'[email protected]','1','','');
INSERT INTO Person VALUES (2,'[email protected]','2','Dennis','Li');
INSERT INTO Person VALUES (3,'[email protected]','1','Brent','Li');
INSERT INTO Person VALUES (4,'[email protected]','1','','');
INSERT INTO Person VALUES (5,'[email protected]','2','','Raji');
INSERT INTO Person VALUES (6,'[email protected]','3','Ben','Raji');
GO
埃兹洛

下一个 CTE 只是显示重复的电子邮件数据。如果您需要一个适用于重复电子邮件和非重复电子邮件的查询,您应该删除第一个 CTE 并完成!

;WITH DuplicatedEmails AS
(
    SELECT
        P.Email
    FROM
        Person AS p
    GROUP BY
        P.Email
    HAVING
        COUNT(1) > 1
),
DuplicatedEmailUserData AS
(
  SELECT
      P.*,
      EmailRanking = ROW_NUMBER() OVER (PARTITION BY Email ORDER BY Priority DESC) -- Assuming a higher priority comes first
  FROM
      Persons AS P
      INNER JOIN DuplicatedEmails AS E ON P.Email = E.Email
)
SELECT
    D1.UserID,
    D1.Email,
    D1.Priority,
    FirstName = COALESCE(D1.FirstName, D2.FirstName, D3.Firstname), -- Use COALESCE for the columns that might be NULL on 1st record
    LastName = COALESCE(D1.LastName, D2.LastName, D3.Lastname)
FROM
    DuplicatedEmailUserData AS D1
    LEFT JOIN DuplicatedEmailUserData AS D2 ON 
        D1.Email = D2.Email AND
        D1.EmailRanking + 1 = D2.EmailRanking
    LEFT JOIN DuplicatedEmailUserData AS D3 ON 
        D1.Email = D3.Email AND
        D2.EmailRanking + 1 = D3.EmailRanking
WHERE
    D1.EmailRanking = 1

使用这种方法,您可能需要LEFT JOIN与重复的电子邮件一样多的次数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何比较 SQL Server 中的前两行

SQL Server中的两行值比较

我想在SQL Server 2008中合并两行

Unix如果为空,则跳过第一行

返回并合并 Google 表格中一行中的所有单元格值

sql将两行合并为一个相同的表。(用第二行数据更新第一行,然后删除第二行)

如果一行为空,则选择另一行

Microsoft SQL Server 2012将完全相邻的两行数据合并为一行

尝试比较Google Spreadsheet中两行的单元格值,如果它们相等则递增计数

比较SQL Server中的第一行和第n行

将单元格内容分成SQL Server中的行

在sql server中插入时将一行拆分为两行

Excel搜索一行中最右边的非空单元格,并在上面的两行中返回该单元格的内容

将最后两行复制/粘贴到下一个空行中,并清除某些单元格(包含合并的单元格)

如果下一行的两个单元格在CSV文件中为空,如何重复列值

SQL如何用值和其他值填充组的第一行为空

如果单元格为空,如何使用 Python 删除 CSV 文件中的一行

如果单元格为空,如何使用 Python 删除 CSV 文件中的一行

SQL Server在选择的第一行中使用变量

sql server选择组的第一行

Excel VBA比较动态单元格区域中的两行

为什么在插入第二行而不在第一行时出现MS SQL Server错误?

如果不是SQL中的第一行,则选择第二行(如果可用)

sed-根据第二行中的模式合并两行

如果第二行包含与第一行相同的匹配项,如何打印两行?

使用第二列比较两行

如果第一行为 0,则从 DataFrame 中选择列

使用tsql下拉列表第一行为空

通过比较SQL Server中的两行来计算列之间的平均值