有人可以请教如何在SQL Server 2000中编写以下代码吗?感谢
WITH cte
AS (SELECT *,
( Row_number() OVER(ORDER BY productid, transactionid,
statusdate
DESC)
)AS
rownum
FROM @table),
cte2
AS (SELECT cte.*,
( CASE
WHEN cte.status = Isnull((SELECT t.status
FROM cte t
WHERE t.rownum = ( cte.rownum + 1
)),
'')
THEN 1
ELSE 0
END )AS rownum2
FROM cte)
SELECT cte2.productid,
cte2.transactionid,
cte2.details,
cte2.status,
cte2.statusdate,
cte2.requestdate
FROM cte2
WHERE rownum2 = 0
答案 0 :(得分:2)
DigbySwift's answer提到ROW_NUMBER存在问题,您需要先解决这个问题。你可以在他的答案中使用这个想法,你也可以看看类似问题的答案,如:
但是还有另一个问题:SQL Server 2000不支持CTE(WITH ... AS ...
)。
要解决此问题,请通过删除WITH
子句并将CTE的定义移动到使用CTE的位置来选择而不是CTE。
例如,使用CTE的此查询:
WITH T1 AS (SELECT a,b,c FROM ...)
SELECT * FROM T1
变为:
SELECT *
FROM (
SELECT a,b,c FROM ...
) AS T1
希望这足以让你开始。
答案 1 :(得分:2)
2000年没有OVER()函数,因此您需要重新寻址/移动初始cte选择。你已经有了一个表变量@table,所以我会通过添加一个标识列来修改它以包含行号。
然后,您可以使用子查询从cte2中提取所需内容。