我正在对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()

08-26 02:55