我在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中编写它
答案 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中。