2015-10-06 71 views
1

不同我有这个疑问: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)。

如何编辑查询?

在此先感谢

+7

您可以通过使用表的别名限定所有的列名,并使用显式'join'语法开始。虽然这不能解决你的问题,但它会让其他人知道你在做什么。示例数据和SQL Fiddle也很有用,因为您实际使用的是数据库的标签。 –

回答

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 
+0

它非常适合IBM db2 db!谢谢! – user2075861

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) 
相关问题