SQL - 选择字段记录相同的值,在另一
问题描述:
不同我有这个疑问:SQL - 选择字段记录相同的值,在另一
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
)。
如何编辑查询?
在此先感谢
答
您可以使用窗口函数(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
+0
它非常适合IBM db2 db!谢谢! – user2075861
答
使用公用表表达式(保存一些输入)。使用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)
您可以通过使用表的别名限定所有的列名,并使用显式'join'语法开始。虽然这不能解决你的问题,但它会让其他人知道你在做什么。示例数据和SQL Fiddle也很有用,因为您实际使用的是数据库的标签。 –