如何为DB2中的每个列类型获取单个最接近的值

时间:2017-05-30 19:53:37

标签: sql database db2

我有这个问题:

SELECT * FROM TABLE1 WHERE KEY_COLUMN='NJCRF' AND TYPE_COLUMN IN ('SCORE1', 'SCORE2', 'SCORE3') AND DATE_EFFECTIVE_COLUMN<='2016-09-17'

我得到了大约12条记录(行)。

如何为每个TYPE_COLUMN获得最接近DATE_EFFECTIVE_COLUMN的结果?在这种情况下,如何为每种类型获得最接近生效日期的三条记录?

更新:如果我不得不只使用单一类型,我可以使用TOP,但此时我有三个,我需要得到最接近的时间结果。

希望我说清楚,如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用ROW_NUMBER()

SELECT t.*
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY TYPE_COLUMN ORDER BY DATE_EFFECTIVE_COLUMN DESC) as seqnum
      FROM TABLE1 t
      WHERE KEY_COLUMN = 'NJCRF' AND
            TYPE_COLUMN IN ('SCORE1', 'SCORE2', 'SCORE3') AND
            DATE_EFFECTIVE_COLUMN <= '2016-09-17'
     ) t
WHERE seqnum = 1;

如果您希望每种类型三个记录,请使用seqnum <= 3

答案 1 :(得分:1)

我喜欢ROW_NUMBER()。您希望按TYPE分区,这将为每种类型开始行计数,然后按DATE_EFFECTIVE desc排序,并仅采用最高日期(第一行):

SELECT *
FROM (
    SELECT *, 
       ROW_NUMBER() over (PARTITION BY TYPE_COLUMN ORDER BY DATE_EFFECTIVE_COLUMN desc) RN
    FROM TABLE1 
    WHERE KEY_COLUMN = 'NJCRF' 
    AND TYPE_COLUMN IN ('SCORE1', 'SCORE2', 'SCORE3') 
    AND DATE_EFFECTIVE_COLUMN <= '2016-09-17'
     ) A
WHERE RN = 1