sql-选择为一个字段记录相同的值,在另一个字段上记录不同的值

sql-选择为一个字段记录相同的值,在另一个字段上记录不同的值,sql,select,db2,Sql,Select,Db2,我有一个疑问: 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 = F

我有一个疑问:

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条记录(具有相同的
cprcco
),我只想选择
FCHPRDT
更高的记录(
20150921

如何编辑查询


提前感谢

您可以使用窗口函数(第一个值),通过CPRCDO进行分区,并通过FCHPRDT(降序)进行排序。看看函数文档

下面的代码将很好地工作,但我建议您也使用内部连接子句,而不是在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

使用公共表表达式(保存一些键入)。如果没有其他行具有相同的
cprcdo
且具有更高的
FCHPRDT
,则使用
notexists
返回一行:

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 FIDLE也很有用,您实际使用的数据库标记也是如此。它非常适合IBM db2 db!谢谢