替换为sqlserver 2005

时间:2017-11-03 07:11:16

标签: sql sql-server-2005 window-functions

我在oracle中有以下查询:

 SELECT DISTINCT
       first_value(status_date) OVER(PARTITION BY ccp_seq_no ORDER BY status_date DESC) status_date,
       first_value(payment_status) OVER(PARTITION BY ccp_seq_no ORDER BY status_date DESC) payment_status
FROM dc_ccp_detail d; 

我将如何在sqlserver 2005中编写它

2 个答案:

答案 0 :(得分:0)

由于SQL Server 2005没有窗口函数,因此您需要使用子查询:获取最新的status_date ccp_seq_no并执行此操作:

select distinct d.status_date, d.dc_ccp_detail
from dc_ccp_detail d
join
(
  select ccp_seq_no, max(status_date) as status_date
  from dc_ccp_detail
  group by ccp_seq_no
) lastd on lastd.ccp_seq_no = d.ccp_seq_no and lastd.status_date = d.status_date;

加入仅用于获取每ccp_seq_no的最后一条记录。通常人们宁愿使用where (status_date, dc_ccp_detail) in (select ccp_seq_no, max(status_date) ...),但SQL Server不支持此功能。

答案 1 :(得分:0)

在您的评论中,您将查询更改为

SELECT DISTINCT
 first_value(status_date) OVER(PARTITION BY ccp_seq_no ORDER BY status_date DESC) status_date,
 first_value(payment_status) OVER(PARTITION BY ccp_seq_no ORDER BY status_date DESC) payment_status
FROM dc_ccp_detail d
WHERE ccp_seq_no = 5;

这是一个可怕的混淆

SELECT status_date, payment_status
FROM dc_ccp_detail
WHERE ccp_seq_no = 5
ORDER BY status_date DESC
FETCH FIRST ROW ONLY;
Oracle 12c中的

和标准SQL和

SELECT TOP(1) status_date, payment_status
FROM dc_ccp_detail
WHERE ccp_seq_no = 5
ORDER BY status_date DESC;

在SQL Server中。