我有这个问题:
select CPRCOSC, CPRCDCO, FCHPRDT ,CPRDTPA
from ocsacpr,
fasaorl,
fasaorh
where CPRCOSC = 'GHY02'
and fclcosc = CPRCOSC
and fclcdcm = CPRCDCO
and fclverc = CPRVER
and fclnumc = CPRNUM
and FCHORDN = FCLORDN
and FCHCOSC = FCLCOSC
它给了我:
CPRCOSC CPRCDCO FCHPRDT CPRDTPA
GHY02 2015000036 20150728 20150728
GHY02 2015000037 20150723 20150723
GHY02 2015000038 20150722 20150722
GHY02 2015000039 20150918 20150930
GHY02 2015000040 20150918 20150930
.....
GHY02 2015000041 20150731 20150731
GHY02 2015000041 20150918 20150831
GHY02 2015000041 20150921 20150930
对于最后3条记录(具有相同的CPRCDCO
),我只想选择FCHPRDT
更高的记录(示例中为20150921
)。
我该如何编辑查询?
提前致谢
答案 0 :(得分:1)
您可以使用窗口功能(FIRST_VALUE),由CPRCDCO分区并按FCHPRDT(降序)排序以执行此操作。看一下功能文档。
https://msdn.microsoft.com/en-us/library/hh213018.aspx
以下代码将运行良好,但我建议您也使用INNER JOIN子句而不是在WHERE子句中进行连接。
SELECT DISTINCT
CPRCOSC,
CPRCDCO,
FIRST_VALUE(FCHPRDT) OVER (PARTITION BY CPRCDCO ORDER BY FCHPRDT DESC) AS FCHPRDT,
FIRST_VALUE(CPRDTPA) OVER (PARTITION BY CPRCDCO ORDER BY FCHPRDT DESC) AS CPRDTPA
FROM
OCSACPR, FASAORL, FASAORH
WHERE
CPRCOSC = 'GHY02'
AND FCLCOSC = CPRCOSC
AND FCLCDCM = CPRCDCO
AND FCLVERC = CPRVER
AND FCLNUMC = CPRNUM
AND FCHORDN = FCLORDN
AND FCHCOSC = FCLCOSC
答案 1 :(得分:0)
使用公用表表达式(以节省一些输入)。如果没有其他行具有相同NOT EXISTS
且CPRCDCO
更高的行,请使用FCHPRDT
返回行:
with cte as
(
select CPRCOSC, CPRCDCO, FCHPRDT ,CPRDTPA
from ocsacpr,
fasaorl,
fasaorh
where CPRCOSC = 'GHY02'
and fclcosc = CPRCOSC
and fclcdcm = CPRCDCO
and fclverc = CPRVER
and fclnumc = CPRNUM
and FCHORDN = FCLORDN
and FCHCOSC = FCLCOSC
)
select * from cte t1
where not exists (select 1 from cte t2
where t2.CPRCDCO = t1.CPRCDCO
and t2.FCHPRDT > t1.FCHPRDT)