【问题标题】:How can I squash these SQL Server results into one row per customer key如何将这些 SQL Server 结果压缩为每个客户键的一行
【发布时间】:2018-07-09 15:30:54
【问题描述】:

我已设法将我们客户的最新营销偏好收集到以下表格中,但无法弄清楚如何将这些结果压缩到每个 [CustomerKey] 的一行中。这是一个示例,当我在下面进一步运行查询时,显然我们有数十万个实际结果。

CustomerKey                 SMS   Phone   Email   Post   Group
--------------------------------------------------------------
ClarkeM21-9EF1976-08-03                                  No
ClarkeM21-9EF1976-08-03                           No
ClarkeM21-9EF1976-08-03                   No
ClarkeM21-9EF1976-08-03           No
ClarkeM21-9EF1976-08-03     No
SmithNG12-8AS1980-02-03                                  No
SmithNG12-8AS1980-02-03                           No
SmithNG12-8AS1980-02-03                   Yes
SmithNG12-8AS1980-02-03           No
SmithNG12-8AS1980-02-03     Yes

这是我用来创建上述内容的相当重复的查询,以防万一有人看到它并认为我是从完全错误的角度来看的;

IF OBJECT_ID('tempdb..#ClientRefPreferenceDates') IS NOT NULL 
     DROP TABLE #ClientRefPreferenceDates;
IF OBJECT_ID('tempdb..#MaxDatePerClientRef') IS NOT NULL 
     DROP TABLE #MaxDatePerClientRef;
IF OBJECT_ID('tempdb..#LatestPrefsbyCustKey') IS NOT NULL 
     DROP TABLE #LatestPrefsbyCustKey;

SELECT  
    mcp.[CustomerKey],
    mcp.[SMS],
    MAX(mcp.[SMS_DateTime]) AS SMSDate,
    '' AS Phone,
    '' AS PhoneDate,
    '' AS Email,
    '' AS EmailDate,
    '' AS Post,
    '' AS PostDate,
    '' AS [Group],
    '' AS GroupDate
INTO 
    #ClientRefPreferenceDates
FROM 
    [audit].[Marketing_Consent_Prefs] mcp
WHERE 
    mcp.[EndDate] IS NULL
GROUP BY 
    CustomerKey, SMS

UNION ALL

SELECT  
    mcp.[CustomerKey],
    '' AS SMS,
    '' AS SMSDate,
    mcp.[Phone],
    Max(mcp.[Phone_DateTime]) AS PhoneDate,
    '' AS Email,
    '' AS EmailDate,
    '' AS Post,
    '' AS PostDate,
    '' AS [Group],
    '' AS GroupDate
FROM
    [audit].[Marketing_Consent_Prefs] mcp
WHERE 
    mcp.[EndDate] IS NULL
GROUP BY  
    CustomerKey, Phone

UNION ALL

SELECT  
    mcp.[CustomerKey],
    '' AS SMS,
    '' AS SMSDate,
    '' AS Phone,
    '' AS PhoneDate,
    mcp.Email,
    MAX(mcp.[Email_DateTime]) AS EmailDate,
    '' AS Post,
    '' AS PostDate,
    '' AS [Group],
    '' AS GroupDate
FROM 
    [audit].[Marketing_Consent_Prefs] mcp
WHERE 
    mcp.[EndDate] IS NULL
GROUP BY CustomerKey, Email

UNION ALL

SELECT  mcp.[CustomerKey],
    '' AS SMS,
    '' AS SMSDate,
    '' AS Phone,
    '' AS PhoneDate,
    '' AS Email,
    '' AS EmailDate,
    mcp.Post,
    Max(mcp.[Post_DateTime]) AS PostDate,
    '' AS [Group],
    '' AS GroupDate
FROM [audit].[Marketing_Consent_Prefs] mcp
WHERE mcp.[EndDate] IS NULL
GROUP BY CustomerKey, Post

UNION ALL

SELECT  mcp.[CustomerKey],
    '' AS SMS,
    '' AS SMSDate,
    '' AS Phone,
    '' AS PhoneDate,
    '' AS Email,
    '' AS EmailDate,
    '' AS Post,
    '' AS PostDate,
    mcp.[Group],
    Max(mcp.[Group_DateTime]) AS GroupDate
FROM [audit].[Marketing_Consent_Prefs] mcp
WHERE mcp.[EndDate] IS NULL
GROUP BY CustomerKey, [Group]

SELECT  CustomerKey,
    SMS,
    Phone,
    Email,
    Post,
    [Group]
FROM #ClientRefPreferenceDates 
GROUP BY CustomerKey, SMS, Phone, Email, Post, [Group]
ORDER BY CustomerKey

【问题讨论】:

  • 向我们展示示例输入数据和预期输出可能会有所帮助(如果当前输出不是您想要的)。

标签: sql-server merge unique


【解决方案1】:

最简单的方法是将您的查询包装在另一个 GROUP BY

SELECT CustomerKey, MAX(SMS), MAX(Phone), MAX(Email), MAX(Post), MAX(Group)
FROM (
    your query
) a
GROUP BY CustomerKey

【讨论】:

    【解决方案2】:

    窗口函数应该做到这一点

    SELECT  distinct 
        mcp.[CustomerKey],
        mcp.[SMS],
        Max(mcp.[SMS_DateTime]) over   (partition by CustomerKey, SMS)  AS SMSDate,
        Max(mcp.[Phone_DateTime]) over (partition by CustomerKey, Email) AS PhoneDate
    INTO #ClientRefPreferenceDates
    FROM [audit].[Marketing_Consent_Prefs] mcp
    WHERE mcp.[EndDate] IS NULL
    GROUP BY 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      相关资源
      最近更新 更多