SQL-删除重复项,使用HAVING子句和NTEXT列选择最新的

问题描述

我的查询返回客户响应。响应表(rp)连接到客户表(ah)。查询返回我想要的结果。

但是,如果记录了多个活动响应,则每个客户返回的响应多于1个。

所以我试图通过添加HAVING子句来限制它,但由于它是NTEXT,所以我无法与responsefreetxt分组。

SELECT 
    ah.CUSTACCOUNT,/--- type = CHAR
    rp.RESPONSEFREETXT      /--- type = NTEXT
FROM 
    ah
INNER JOIN 
    rp ON rp.CUSTACCOUNT = ah.CUSTACCOUNT
    ...
WHERE 
    ah.ACTIVE = 1
    AND rp.ACTIVE = 1
    AND ...
GROUP BY 
    ah.CUSTACCOUNT,rp.RESPONSEFREETXT
HAVING 
    COUNT(ah.CUSTACCOUNT) = 1
ORDER BY 
    rp.date DESC

导致此错误

Msg 306,第16级,状态2,第21行
text,ntext和image数据类型无法比较或排序,除非使用IS NULL或LIKE运算符。

理想情况下,我想为每个客户返回1行,如果重复,则仅返回最新的响应。

我该怎么办?

谢谢!

解决方法

从SQL Server处理此问题的一种方法是使用ROW_NUMBER

WITH cte AS (
    SELECT ah.CUSTACCOUNT,rp.RESPONSEFREETXT,ROW_NUMBER() OVER (PARTITION BY ah.CUSTACCOUNT
                              ORDER BY rp.SOME_DATE DESC) rn
    FROM ah
    INNER JOIN rp ON rp.CUSTACCOUNT = ah.CUSTACCOUNT
    ...    
    WHERE ah.ACTIVE = 1 AND rp.ACTIVE = 1 AND ...
    -- I have removed the GROUP BY clause
)

SELECT *
FROM cte
WHERE rn = 1;

这假设在响应表中存在一个名为SOME_DATE的列,该列跟踪每个客户响应的时间戳。编写上述查询的另一种方式是使用TOP 1 WITH TIES

SELECT TOP 1 WITH TIES ah.CUSTACCOUNT,rp.RESPONSEFREETXT
FROM ah
INNER JOIN rp ON rp.CUSTACCOUNT = ah.CUSTACCOUNT
...    
WHERE ah.ACTIVE = 1 AND rp.ACTIVE = 1 AND ...
ORDER BY ROW_NUMBER() OVER (PARTITION BY ah.CUSTACCOUNT
                            ORDER BY rp.SOME_DATE DESC);