SQL:根据最小日期获取值

时间:2016-02-18 16:54:39

标签: sql oracle greatest-n-per-group

在以下示例中,我希望根据最短日期获取状态值:

 instId: status : instDate
 25478 : 5      : 18/02/16 13:32:14
 25478 : 3      : 18/02/16 13:32:05
 25478 : 1      : 18/02/16 13:32:11
 69854 : 9      : 18/02/16 16:22:10
 69854 : 5      : 18/02/16 16:22:26
 69854 : 4      : 18/02/16 16:22:15

输出为

25478 : 3
69854 : 9

编辑: 我这样做但似乎无法正常工作

select instId, MAX(status) KEEP (DENSE_RANK FIRST ORDER BY instDate DESC NULLS LAST) STATUS
from sales
group by instId;

2 个答案:

答案 0 :(得分:1)

只需使用ROW_NUMBER()

即可
SELECT instId, status
FROM (
        SELECT instId, status, 
               row_number() over (partition by instId
                                  order by date) as rn
        FROM YourTable
     ) T
WHERE rn = 1

但如果两行具有相同的日期和不同的状态,则会导致问题。您将在tie行之间获得随机状态。

答案 1 :(得分:1)

如果您想要最低日期,请按ASC而不是DESC订购:

select instId,
       MAX(status) KEEP (DENSE_RANK FIRST ORDER BY instDate ASC NULLS LAST) as STATUS
       -----------------------------------------------------^
from sales
group by instId;

我发现这通常比row_number()方法更快。