问题描述
我的查询返回客户响应。响应表(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);