SQL:选择最小值和行中具有最小值的其他值

时间:2019-03-14 20:44:36

标签: sql oracle groupwise-maximum

使用Oracle SQL,我想根据参加考试的时间来选择一组人员的ID,考试日期和考试结果。我的问题是优先顺序不是按时间顺序排列的。我想在1年中选择一个日期。如果他们在1年中没有日期,我想要3年中的日期。如果他们没有1或3年,我想要2年中的日期。

我使用了一个case函数来创建一个变量(check1),以根据进行测试的年份的优先级为每行分配一个值。因此,所有行在check1列中都有1、2或3。 (1是最高优先级,3是最低优先级。)

我知道使用以下方法可以分为几类:

function format_url($url, $page) {
        $x = parse_url($page);
        $urlX = explode('/', $url);
        $name = end($urlX);

        if(strpos($url, 'http') === 0) {

        } else if(strpos($url, '//') === 0) {

            $url = 'https:'.$url;

        } else {
        // RELATIVE URL 

            // ROOT FOLDER
            if(strpos($url, '/') === 0) {
                $url = $x['scheme'].'://'.$x['host'].$url;


            } else {
                $url = rel2abs($url, $page);

            }
        }
        return $url;
    }

这是我的问题:我还需要他们参加考试的日期,以便我可以将正确的考试结果加入到希望的日期。当我尝试将日期添加到上一个功能时:

SELECT ID, MIN(check1) 
FROM datatable 
GROUP BY ID;

Oracle错误,因为date变量不在GROUP BY函数中。但是,当我按功能将日期放入分组时,它将选择所有记录,而不仅仅是min(check1)。

如何获取每人要选择日期的一行?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

最快的方法通常是相关子查询:

SELECT t.* 
FROM datatable t
WHERE t.date = (SELECT MIN(t2.check1) FROM datatable t2 WHERE t2.id = t.id);

或者,使用KEEP进行聚合:

select id, min(check1), min(date) keep (dense_rank first order by check1 asc) as date
from datatable t
group by id;