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

时间:2015-10-06 10:41:27

标签: 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 = 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)。

我该如何编辑查询?

提前致谢

2 个答案:

答案 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 EXISTSCPRCDCO更高的行,请使用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)