我有这个问题:
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,但此时我有三个,我需要得到最接近的时间结果。
希望我说清楚,如果您需要更多信息,请告诉我。
答案 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