我正在对SQL Server 2008+运行此查询,但在SQL Server 2000上不起作用。
我需要这个来执行。
WITH CTE AS (
SELECT
custnum,
custname,
RN = ROW_NUMBER() OVER( PARTITION BY custnum, custname ORDER BY custnum )
FROM
cust
)
SELECT
*
FROM
CTE
WHERE RN > 1
非常感谢你的帮助!
最佳答案
在SQL Server 2005之前,此问题域通过在具有#temp
列的IDENTITY
表中进行有序插入来生成序列号来解决。这样可以解决RANK()
和ROW_NUMBER()
的要求。
例如。:
-- Create empty temp table
SELECT custnum, custname, IDENTITY(INT, 1, 1) as RN
INTO #cust
FROM cust
WHERE 0 = 1
-- Populate with ORDER BY, to generate ascending RN
INSERT INTO #cust
(custnum, custname)
SELECT
custnum, custname
FROM
cust
ORDER BY
custnum, custname
此时,您可以查询
MIN()
每个客户编号/客户名称分组,并像使用CTE一样使用它。但是...真的是您想要的
ROW_NUMBER()
吗?似乎您想要的是RANK()
,而不是ROW_NUMBER()
。